聚合中get和mget的不同beheavior(R)

聚合中get和mget的不同beheavior(R),r,aggregate,R,Aggregate,我有一个列名称的字符数组(chr[1:5]名为keynn),我想对其执行聚合。 数组的所有元素都是数据框的有效列名(mydata),但它是字符串而不是变量(“YEAR”而不是mydata$YEAR) 我尝试使用get()从名称返回列,它对第一个元素有效,如下所示: attach(mydata) aggregate(mydata, by=list(get(keynn, .GlobalEnv)), FUN=length) 我尝试使用mget(),因为我的数组作为多个元素,如下所示: attach(

我有一个列名称的字符数组(
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.
如何获得多个要聚合的列的等效get


谢谢大家!

我建议一般不要使用
attach

如果您只是试图从
mydata
中获取列,则可以使用
[
为列表编制索引

aggregate(mydata, by = mydata[keynn], FUN = length)
应该可以工作——很明显,您希望从
mydata

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

试一试

因此,如果要使用
mget
attach
,则需要

 mget(keynn, .GlobalEnv, inherits = TRUE)
这样它就不会只在全球环境中搜索了

但这是不值得的(IMHO)

之所以
get
有效,是因为默认情况下
inherits=TRUE
。因此,如果附加了
mydata
,您可以使用
lappy(keynn,get)
,但这又是一个丑陋且不清楚它在做什么的问题


另一种方法是使用
data.table
,它将通过相关data.table中的
参数来评估

 library(data.table)

 DT <- data.table(mydata)

 DT[, {what you want to aggregate} , by =keynn]
库(data.table)

DT
aggregate(mydata,by=mydata[keynn],FUN=length)
效果很好。谢谢。非常感谢。mget应该做什么?
 library(data.table)

 DT <- data.table(mydata)

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