我有一个字符数组(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.
如何通过?
获取多列聚合的等价物?谢谢!
答案 0 :(得分:2)
我建议不要一般使用attach
如果您只是想从mydata
获取列,则可以使用[
索引列表
aggregate(mydata, by = mydata[keynn], FUN = length)
应该有用 - 并且非常清楚您希望从keynn
获取mydata
使用attach
的问题在于它将mydata
添加到搜索路径(而不是复制到全局环境)
试
attach(mydata)
mget(keynn, .GlobalEnv)
因此,如果您使用mget
和attach
,则需要
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不需要是名称的字符向量,它可以是名称列表或名称函数的命名列表等