前言
在[[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 标记,并加上名称列中;
- 合并先前的内容;
## 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)
如下: