R 为什么data.table组会根据是否直接传递变量名而有所不同?

R 为什么data.table组会根据是否直接传递变量名而有所不同?,r,data.table,R,Data.table,如果我将变量血压传递到data.table,一切正常 tdt <- data.table(bloodpressure = rnorm(1000, mean=100, sd=15), male=rep(c(0,1))) strata.var <- with(tdt, get(c('male'))) tdt[,list( varname='bloodpressure', N=.N, mean=mean(bloodp

如果我将变量
血压
传递到data.table,一切正常

tdt <- data.table(bloodpressure = rnorm(1000, mean=100, sd=15), male=rep(c(0,1)))
strata.var <- with(tdt, get(c('male')))

tdt[,list(
            varname='bloodpressure',
            N=.N,
            mean=mean(bloodpressure, na.rm=TRUE),
            sd=sd(bloodpressure, na.rm=TRUE)
            ),
        by=(strata.var)]
哪一个匹配组的意思

> mean(tdt$bloodpressure[tdt$male==0])
[1] 100.2821
> mean(tdt$bloodpressure[tdt$male==1])
[1] 100.0392
但是如果我试图以编程方式执行此操作,并且该变量存储在另一个变量(
var
)中

请注意,
平均值
是相同的(即,在整个样本中而不是按组计算)

> mean(tdt$bloodpressure)
[1] 100.1606
好的。在我的帮助下,我想我有了一个答案

colVars <- c('bloodpressure')
byCols <- c('male')
tdt[, lapply(.SD, function(x) mean=mean(x)), .SDcols = colVars, by=byCols]
tdt[, list(
    mean = lapply(.SD, function(x) mean(x)),
    sd = lapply(.SD, function(x) sd(x))
    ), .SDcols = colVars, by=byCols]

colVars您可以将
mean=mean(var,na.rm=TRUE),
替换为
mean=mean(get(var_as_字符串),na.rm=TRUE)
然后它应该可以工作-否则它只使用
var
中的数字向量,而不是您希望它使用的数据表列(并为两个子组返回
mean(var)

库(data.table)
种子(1)

tdt@Arun我认为我不理解范围问题…我已经将
血压
分配给
var
,但这显然是不正确/不充分的,并且
数据。表
只看到
var
。我将进一步阅读…;)我还不确定,但我想你可能已经发现了一个错误。。测试。威尔回信:-)。是的,正如我所怀疑的,这是一个错误。提出。谢谢并不是说我知道的更好,但这比我在下面遇到并发布的
.SDcols
方法更可取吗?首先,它看起来更简单,所以我更喜欢这样。我只是比较了一下速度,它似乎也稍微快了一点,但我会选择更简单的语法…干杯。我已经切换到
.SDcols
方法,因为它似乎更通用-至少在我手中;)-并且修复了我在
by
子句中遇到的类似问题。
   strata.var       varname   N     mean       sd
1:          0 bloodpressure 500 100.1606 15.13686
2:          1 bloodpressure 500 100.1606 15.02566
> mean(tdt$bloodpressure)
[1] 100.1606
colVars <- c('bloodpressure')
byCols <- c('male')
tdt[, lapply(.SD, function(x) mean=mean(x)), .SDcols = colVars, by=byCols]
tdt[, list(
    mean = lapply(.SD, function(x) mean(x)),
    sd = lapply(.SD, function(x) sd(x))
    ), .SDcols = colVars, by=byCols]
library(data.table)
set.seed(1)
tdt <- data.table(bloodpressure = rnorm(1000, mean=100, sd=15), male=rep(c(0,1)))
strata.var <- with(tdt, get(c('male')))

tdt[,list(
        varname='bloodpressure',
        N=.N,
        mean=mean(bloodpressure, na.rm=TRUE),
        sd=sd(bloodpressure, na.rm=TRUE)
        ),
    by=(strata.var)]        
#   strata.var       varname   N      mean       sd
#1:          0 bloodpressure 500  99.58425 15.55735
#2:          1 bloodpressure 500 100.06630 15.50188

var_as_string <- 'bloodpressure'

tdt[,list(
        varname='bloodpressure',
        N=.N,
        mean=mean(get(var_as_string), na.rm=TRUE),
        sd=sd(bloodpressure, na.rm=TRUE)
        ),
    by=(strata.var)]                
#   strata.var       varname   N      mean       sd
#1:          0 bloodpressure 500  99.58425 15.55735
#2:          1 bloodpressure 500 100.06630 15.50188