如何{grep匹配模式的列并计算这些列的行均值,然后将平均值作为新列添加到r中的数据框中?

时间:2019-06-14 04:08:41

标签: r regex

我想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))])

您有任何想法该怎么做吗?

谢谢

2 个答案:

答案 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)] )  )