如何根据匹配的列名计算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)))
但显然这不起作用......
答案 0 :(得分:2)
试试这个:
sapply(unique(colnames(out)), function(i)
rowMeans(out[,colnames(out) == i]))
答案 1 :(得分:1)
正如@Laterow在评论中指出的那样,重复的列名会在某些时候导致麻烦;如果不在这里,你的代码中的其他地方。现在最好把它扼杀在萌芽状态。
如果您从重复的列名开始,请首先在列上使用make.unique
,以.n
为n
的每个副本添加.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:修复了基于评论的代码错误和明确的起点推理