前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >81-R编程14-重复值的两种特殊处理

81-R编程14-重复值的两种特殊处理

作者头像
北野茶缸子
发布2022-01-04 19:40:18
5310
发布2022-01-04 19:40:18
举报

前言

在[[15-R编程01-基本数据类型及其操作之向量]] 中,我就已经简单的提过,可以通过unique 或duplicated 非常暴力的实现去重。

那么我们可不可以有更好的策略呢?

比我测量的数据中的a 对应了多个连续值,我可不可对这些连续值进行一定的处理呢?

当然可以。

对重复数据取均值或中位数

太懒了,这里就不造假数据了:

代码语言:javascript
复制
> head(gistics_final_1)
         fdr  G_Score Cytoband  Unique_Name
1: 14.838026 4.058454   Yp11.2 AP_18:Yp11.2
2: 14.579607 4.002960   Yp11.2 AP_18:Yp11.2
3:  5.643477 2.235219   Yp11.2 AP_17:Yp11.2
4:  5.399866 0.806574   9p21.3  DP_7:9p21.3
5:  5.429016 0.817401   9p21.3  DP_7:9p21.3
6:  5.352462 0.801161   9p21.3  DP_7:9p21.3

我们的目的是,按照Unique_Name 中的内容分组,对其对应的fdr 与G_Score 连续数据取中位数。

其实非常简单,直接利用tidyverse 套件里的group_by 函数,接着直接用summarise 对结果计算:

代码语言:javascript
复制
gistics.BT_final_1 <- gistic.BT.cytoband[,c(5,6,9,10)]
head(gistics.BT_final_1)

gistics.BT_final <- gistics.BT_final_1 %>% group_by(Unique_Name) %>%
  summarise(
    fdr_m = median(fdr),
    G_Score_m = median(G_Score)
  )

也就实现了类似去重的功能:

代码语言:javascript
复制
> head(gistics.BT_final)
# A tibble: 6 × 3
  Unique_Name     fdr_m G_Score_m
  <chr>           <dbl>     <dbl>
1 AP_1:1p11.1    0.0556     0.469
2 AP_10:11p11.11 2.53       1.28 
3 AP_11:12p13.31 0.406      0.645
4 AP_12:12q15    2.60       1.34 
5 AP_13:16p11.2  1.26       0.901
6 AP_15:17q12    0.687      0.715

详细的用法参见:[[35-R数据整理07-使用tidyr和dplyr处理数据框2]]

将重复名称进行顺序标记

比如给重复的这三个名称加上1:n,n 是重复的次数:

思路如下:

  • 将表格元素按照是否重复拆分;
  • 将重复元素的表格,按照名称进行拆分为列表;
  • 利用lapply 遍历列表中的每个数据框,按照顺序给数据框添加1:n 标记,并加上名称列中;
  • 合并先前的内容;
代码语言:javascript
复制
## duplicated or not
duplicated_label <- unique(for_label2[duplicated(for_label2$Unique_Name),]$Unique_Name)
for_label2_du <- for_label2[for_label2$Unique_Name %in% duplicated_label,]
for_label2_no <- for_label2[!for_label2$Unique_Name %in% duplicated_label,]
## split duplicated df then mark them with order
label_list <- split(for_label2_du, for_label2_du$Unique_Name)
tmp <- lapply(label_list, function(x){
  x <- x %>% mutate(order = 1:nrow(x))
  x$Unique_Name <- paste0(x$Unique_Name, "-", x$order)
  x$order <- NULL
  x
})
## list into df then combine with no
for_label2_du <- do.call("rbind",tmp)
for_label2 <- rbind(for_label2_du, for_label2_no)

如下:

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-01-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 北野茶缸子 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 对重复数据取均值或中位数
  • 将重复名称进行顺序标记
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档