具有匹配列名称的Rowmeans

时间:2016-02-04 15:54:07

标签: r

如何根据匹配的列名计算data.frame的rowMeans

前)

 c1=rnorm(10)
 c2=rnorm(10)
 c3=rnorm(10)
 out=cbind(c1,c2,c3)
 out=cbind(out,out)

我意识到价值是相同的,这只是为了演示。 每行都是特定的测量类型(考虑它是一个因素)。

想象一下c1 =化合物1,c2 =化合物2等。 我想将所有c1组合在一起并将这些行平均在一起。然后重复所有unique(colnames(out))

我的想法是这样的:

avg = rowMeans(out,by=(unique(colnames(out))) 

但显然这不起作用......

2 个答案:

答案 0 :(得分:2)

试试这个:

sapply(unique(colnames(out)), function(i)
  rowMeans(out[,colnames(out) == i]))

答案 1 :(得分:1)

正如@Laterow在评论中指出的那样,重复的列名会在某些时候导致麻烦;如果不在这里,你的代码中的其他地方。现在最好把它扼杀在萌芽状态。

如果您从重复的列名开始,请首先在列上使用make.unique,以.nn的每个副本添加.1增量,从colnames(out) <- make.unique(colnames(out)); 开始,对于第一个副本,保留最初的唯一名称:

rowMeans

一旦完成(或者在评论中解释OP,如果它已经由列创建功能静默完成),您可以使用dplyr::select执行starts_with操作&#39; library(dplyr); avg_c1 <- rowMeans(select(out, starts_with("c1")); 参数根据前缀对列进行分组:

 case_count <- as.integer(sub('^c\\d+\\.(\\d+)$', '\\1', colnames(out)[ncol(out)])) + 1L;
    var_count  <- as.integer(ncol(out) %/% case_count);
    avg_c <- as.data.frame(matrix(nrow = var_count , ncol = nrow(out)));

    for (i in 1:var_count) {
        avg_c[i, 1:nrow(out)] <- rowMeans(select(as.data.frame(out), starts_with(paste0("c", i))));
    }

如果你有大量的列,而不是单独指定它们,你可以使用下面的代码让它创建rowMeans的数据框,而不管输入大小如何:

select first_name
      ,last_name
      ,address
  from people

正如@Tensibai在评论中指出的那样,这个解决方案可能效率不高,而且根据您的实际数据集可能有些过分。您可能不需要它提供的灵活性,这可能是一种更简洁的方式。

EDIT1:基于OP评论
EDIT2:根据评论,一次处理所有rowMeans EDIT3:修复了基于评论的代码错误和明确的起点推理