考虑一下我们有一个数字data.frame foo
,并希望找到每两列的总和:
foo <- data.frame(x=1:5,y=4:8,z=10:14, w=8:4)
bar <- combn(colnames(foo), 2, function(x) foo[,x[1]] + foo[,x[2]])
bar
# [,1] [,2] [,3] [,4] [,5] [,6]
#[1,] 5 11 9 14 12 18
#[2,] 7 13 9 16 12 18
#[3,] 9 15 9 18 12 18
#[4,] 11 17 9 20 12 18
#[5,] 13 19 9 22 12 18
一切都很好,除了bar
中缺少的列名。我希望bar
的列名显示foo
中的相关列,例如在此示例中:
colnames(bar) <- apply(combn(colnames(foo),2), 2, paste0,collapse="")
colnames(bar)
#[1] "xy" "xz" "xw" "yz" "yw" "zw"
这很简单,但我想在同一bar <- combn(...)
命令中执行列标记。反正有吗?
答案 0 :(得分:3)
这是可能的,但它会混淆你的代码。这里简洁与清晰之间的权衡是尖锐的。
要了解其工作原理,请参考this question。
colnames(x) <- y
内部重写为
x <- `colnames<-`(x,y)
然后您可以自己进行翻译。
bar <- `colnames<-`(combn(colnames(foo), 2, function(x) foo[,x[1]] + foo[,x[2]]),
apply(combn(colnames(foo),2), 2, paste0,collapse=""))
然而,在许多情况下,以这种方式折叠代码行所需的心理和句法体操是不值得的。多行往往更清晰。
答案 1 :(得分:3)
您从data.frame开始,而不是矩阵。并不重要,但它有助于跟上我们通常使用的术语。
你所追求的是不可能的。如果您查看combn
的代码,则在简化结果时,它不使用维名称。
}
if (simplify)
array(out, dim.use)
else out
}
您可以破解该功能并使其添加尺寸名称,或者,您可以手动将其添加到结果 post festum 。