我想grep列的名称并计算它们的行平均值,并将平均值作为新列添加到数据框中。 这是我的数据框:
df <- data.frame(smp1.ex.rep1 = c(1,2,4,2), smp1.ex.rep2 = c(2,4,5,2), smp1.ex.rep3 = c(3,2,3,3), smp2.int.rep1 = c(3,2,4,5), smp2.int.rep2 = c(5,4,3,4), smp3.ex.rep1 = c(2,3,4,2), smp3.int.rep2 = c(1,3,5,6), smp3.int.rep3 = c(3,6,2,6))
我的df如下所示:
> df
smp1.ex.rep1 smp1.ex.rep2 smp1.ex.rep3 smp2.int.rep1 smp2.int.rep2
1 2 3 3 5
2 4 2 2 4
4 5 3 4 3
2 2 3 5 4
我想grep具有相同模式的列,直到“ rep *”并计算它们的rowmean并将其变异为新列。
例如,将smp1.ex列与rep1,rep2,rep3一起使用,将smp2.int列与rep1,rep2一起放在末尾。并在数据框中添加名称为smp1,ex.mean和smp2.int.mean的每组列的行均值。
所需的输出将是:
smp1.ex.rep1 smp1.ex.rep2 smp1.ex.rep3 smp2.int.rep1 smp2.int.rep2 smp1.ex.mean smp2.int.mean
1 2 3 3 5 2.00 4.0
2 4 2 2 4 2.66 3.0
4 5 3 4 3 4.00 3.5
2 2 3 5 4 2.33 4.5
这是我想要做的:
names <- colnames(df)
names <- unique(gsub("rep*.*", "", names))
df <- rowMeans(df[,grep(paste(names[1:length(names)], 1:3, sep = "."), colnames(df))])
您有任何想法该怎么做吗?
谢谢
答案 0 :(得分:4)
一个选项是用\\d+$
删除末尾(sub
)的数字,使用该数字将split
的数据集放入list
的{{1}}中s,获取data.frame
并将其分配给数据集中的新列
rowMeans
答案 1 :(得分:1)
使用cbind
添加其他列,并使用grepl
(或grep
)选择要传递给rowMeans
的列:
df.new <- cbind( df, smp1.ex.mean = rowMeans( df[ , grepl("ex", names(df)] ),
smp2.int.mean = rowMeans( df[ , grepl("int", names(df)] ) )