背景
当处理临床样本的数据框时,列名是样本名(SID),而有些样本可能来源于同一病人,我们希望将来源于同一病人的数据进行整合(本例为求平均),变为一列,由此生成一个列名为病人名(PID)的新的数据框。
R语言实现
library("dplyr")
# Build test data
data = data.frame(c(1:10),c(11:20),c(21:30),c(31:40),c(41:50),c(51:60))
SID = c("a1", "a2", "b1", "b2", "c1", "d1")
PID = c("a", "b", "c", "d")
colnames(data) <- SID
> data
a1 a2 b1 b2 c1 d1
1 1 11 21 31 41 51
2 2 12 22 32 42 52
3 3 13 23 33 43 53
4 4 14 24 34 44 54
5 5 15 25 35 45 55
6 6 16 26 36 46 56
7 7 17 27 37 47 57
8 8 18 28 38 48 58
9 9 19 29 39 49 59
10 10 20 30 40 50 60
# Proccess data
new_data = matrix(NA, nrow(data), length(PID))
for(i in 1:length(PID)){
rep_columns = select(data, contains(PID[i]))
new_data[, i] = apply(rep_columns, 1, mean)
}
new_data = as.data.frame(new_data)
colnames(new_data) = PID
一起来看看前后对比吧:
> data
a1 a2 b1 b2 c1 d1
1 1 11 21 31 41 51
2 2 12 22 32 42 52
3 3 13 23 33 43 53
4 4 14 24 34 44 54
5 5 15 25 35 45 55
6 6 16 26 36 46 56
7 7 17 27 37 47 57
8 8 18 28 38 48 58
9 9 19 29 39 49 59
10 10 20 30 40 50 60
> new_data
a b c d
1 6 26 41 51
2 7 27 42 52
3 8 28 43 53
4 9 29 44 54
5 10 30 45 55
6 11 31 46 56
7 12 32 47 57
8 13 33 48 58
9 14 34 49 59
10 15 35 50 60
网友评论