【问题标题】:Aggregate columns specified in list聚合列表中指定的列
【发布时间】:2017-09-08 23:53:07
【问题描述】:

我正在使用以下方法聚合 R 数据框中的多个列:

data = data.frame(X=c(1, 3, 3), Y=c(2, 3, 3), Z=c(5, 6, 7), ID=c(10, 11, 12))
with(data, aggregate(cbind(Z, ID), list(X=X, Y=Y), c))

但是,我想使用列表变量选择列。我尝试了一些复杂的 paste 语句来查看 this questionthis question,但我收到诸如“找不到对象 'Z'”之类的错误消息。

如何使用基本 R 以简明易读的方式执行此操作,最好不使用库,do.call 或难以阅读的充满括号和撇号的 paste 语句?理想情况下:

k = c("Z", "ID")
aggregate(magic(k), list(X=X, Y=Y), data, c)

【问题讨论】:

  • aggregate(data[k], data[c("X","Y")], c) 涵盖在?aggregate 中,有两种语法形式。
  • @Frank: aggregate(data[k], data[c("X","Y")], c) 又短又漂亮!您可以将此作为建议的答案发布。我怀疑会有更好的建议。

标签: r aggregate


【解决方案1】:

你可以的

aggregate(data[k], data[c("X","Y")], c)

data.frame 是一个列表,所以 by=data[c("X","Y")] 在这里可以根据需要工作。

【讨论】:

  • 发帖是因为我找不到骗子,而 OP 建议这样做。
【解决方案2】:

试试这个:

data = data.frame(X=c(1, 3, 3), Y=c(2, 3, 3), Z=c(5, 6, 7), ID=c(10, 11, 12))

# I would use quote:
by.expr <- quote(cbind(Z, ID))
with(data, aggregate(eval(by.expr), list(X=X, Y=Y), c))

# list-version:
by.l <- list("Z", "ID")
by.expr <- parse(text = paste("cbind(", unlist(by.l), ")"))
with(data, aggregate(eval(by.expr), list(X=X, Y=Y), c))

【讨论】:

    猜你喜欢
    • 2016-12-06
    • 1970-01-01
    • 1970-01-01
    • 2017-08-04
    • 2021-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多