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

2022-01-04 19:40:18 浏览数 (1)

前言

在[[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)

如下:

0 人点赞