2

考虑我们有一个数字 data.framefoo并希望找到每两列的总和:

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(...)命令中执行列标签。到底有没有?

4

2 回答 2

3

这是可能的,但它会混淆你的代码。这里简洁和清晰之间的权衡是尖锐的。

为了理解它是如何工作的,我参考了这个问题

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=""))

然而,在许多情况下,以这种方式折叠代码行所需的心理和句法体操是不值得的。多行往往更清晰。

于 2014-01-04T09:18:29.257 回答
3

您从 data.frame 开始,而不是矩阵。没那么重要,但它有助于跟上我们通常使用的行话。

你所追求的是不可能的。如果您查看 的代码combn,当结果被简化时,它没有使用维度名称。

    }
    if (simplify) 
        array(out, dim.use)
    else out
}

您可以破解该函数并使其添加维度名称,或者您可以手动将其添加到您的结果post festum

于 2014-01-04T09:19:47.937 回答