【问题标题】:Formatting colnames to be read by cbind格式化 cbind 读取的列名
【发布时间】:2021-05-26 00:01:40
【问题描述】:

假设我有一个名为 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`,`D`,`E`,`F` 

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

"C, D, E, F"

但是cbind 没有正确读取。

有什么建议吗?

【问题讨论】:

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

标签: r dataframe aggregate cbind tapply


【解决方案1】:

除了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, data=df, 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))

【讨论】:

  • 非常感谢您的回答!似乎确实需要反引号,因为它们是从 csv 作为列名的一部分导入的。是否有一种简单的方法可以将它们取回,或者只是将它们从 colnames 中删除?
  • @WeierstraßRamirez 是的,我建议使用names(df) &lt;- gsub("`", "", names(df)) 摆脱它们。
  • @WeierstraßRamirez 其实我很好奇你的数据是什么样的,你能像我一样创建一个小例子吗?只需使用 dput 描述的 here under "Copying original data",这是在 Stack Overflow 上共享数据的常用方式。
  • 所以实际上,我认为问题在于 R 添加了反引号,因为我的数据中有复合列名,这是来自实际的列名(df):[1] "CATEGORY" "PARENT" "品牌” “媒体” “物业” “TOTAL DOLS” “TOTAL UNITS” [8] “2011 DOLS” “2011 UNITS” “2012 DOLS” “2012 UNITS” “2013 DOLS” “2013 UNITS” “2014 DOLS” [15] “2014 年单位”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-03
  • 2013-02-14
  • 1970-01-01
  • 2016-05-19
  • 2012-08-13
  • 2021-03-25
相关资源
最近更新 更多