get和mget在聚合中的不同行为(R)

时间:2013-03-07 21:21:58

标签: r aggregate

我有一个字符数组(chr [1:5]名为keynn)列名,我想在其上执行聚合。 数组的所有元素都是数据框的有效列名(mydata),但它是一个字符串而不是变量(“YEAR”而不是mydata$YEAR)。

我尝试使用get()从名称返回列,对于第一个元素,它可以正常工作,如下所示:

attach(mydata)
aggregate(mydata, by=list(get(keynn, .GlobalEnv)), FUN=length)

我尝试使用mget(),因为我的数组是多个元素,如下所示:

attach(mydata)
aggregate(mydata, by=list(mget(keynn, .GlobalEnv)), FUN=length)

但是我收到了错误:

value for 'YEAR' not found.

如何通过?

获取多列聚合的等价物?

谢谢!

1 个答案:

答案 0 :(得分:2)

我建议不要一般使用attach

如果您只是想从mydata获取列,则可以使用[索引列表

aggregate(mydata, by = mydata[keynn], FUN = length)

应该有用 - 并且非常清楚您希望从keynn获取mydata

使用attach的问题在于它将mydata添加到搜索路径(而不是复制到全局环境)

 attach(mydata)
 mget(keynn, .GlobalEnv)

因此,如果您使用mgetattach,则需要

 mget(keynn, .GlobalEnv, inherits = TRUE)

这样它就不会只在全球环境中搜索。

但这比努力更值得努力(恕我直言)

get的作用原因是默认情况下为inherits = TRUE。因此,如果lapply(keynn, get)被附加,您可以使用mydata,但这又是丑陋的,并且不清楚它在做什么。


另一种方法是使用data.table,它将评估data.table中的by参数

 library(data.table)

 DT <- data.table(mydata)

 DT[, {what you want to aggregate} , by =keynn]

请注意,keynn不需要是名称的字符向量,它可以是名称列表或名称函数的命名列表等