格式化由 cbind 读取的列名

问题描述

假设我有一个名为 df 的列表,使得 colnames(df) 产生:

"A"           "B"          "C"                 "D"           "E"                 "F" 

我希望通过以下方式汇总数据:

aggregate(cbind(`C`,`D`,`E`,`F`)~A+B,data = df,FUN = sum)

当然我可以“手动”完成,但在我的真实数据中,我有大量的列,所以我试图将 colnames(df)[3:6] 输出更改为 yield:

`C`,`F` 

相反。到目前为止,我已经尝试使用 toString(colnames(df)[3:6]) 产生:

"C,D,E,F"

但是 cbind 没有正确读取。

有什么建议吗?

解决方法

您还可以使用从子集数据框创建的矩阵来代替 cbind

aggregate(as.matrix(df[names(df)[3:6]])~A+B,data=df,FUN=sum)
#       A     B     C     D     E     F
# 1  0.36 -0.11  2.02  2.29 -0.13 -2.66
# 2 -0.56  0.40 -0.09  1.30 -0.28 -0.28
# 3  1.37  0.63  1.51 -0.06 -1.39  0.64

或者,从字面上回答你的问题试试

(ev <- sprintf("cbind(%s)",toString(names(df)[3:6])))
# [1] "cbind(C,D,E,F)"

我认为不需要反引号。是吗?

然后,当然:

aggregate(eval(parse(text=ev))~A+B,FUN=sum)
#       A     B     C     D    E     F
# 1 -2.44 -1.78  1.90 -1.76 0.46 -0.61
# 2  1.32 -0.17 -0.43  0.46 0.70  0.50
# 3 -0.31  1.21 -0.26 -0.64 1.04 -1.72

数据:

df <- structure(list(A = c(-2.44,1.32,-0.31),B = c(-1.78,-0.17,1.21),C = c(1.9,-0.43,-0.26),D = c(-1.76,0.46,-0.64),E = c(0.46,0.7,1.04),F = c(-0.61,0.5,-1.72)),class = "data.frame",row.names = c(NA,-3L))