为什么data.table组的不同取决于我是否直接传递变量名?

时间:2014-10-10 14:40:14

标签: r data.table

如果我将变量bloodpressure传递给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)]

我得到了这个结果

   strata.var       varname   N     mean       sd
1:          0 bloodpressure 500 100.2821 15.13686
2:          1 bloodpressure 500 100.0392 15.02566

哪个匹配组意味着

> mean(tdt$bloodpressure[tdt$male==0])
[1] 100.2821
> mean(tdt$bloodpressure[tdt$male==1])
[1] 100.0392

但是,如果我尝试以编程方式执行此操作,并且该变量存储在另一个变量(var

var_as_string <- 'bloodpressure'
var <- with(tdt, get(var_as_string))

tdt[,list(
            varname='bloodpressure',
            N=.N,
            mean=mean(var, na.rm=TRUE),
            sd=sd(bloodpressure, na.rm=TRUE)
            ),
        by=(strata.var)]

我得到了不同的结果。

   strata.var       varname   N     mean       sd
1:          0 bloodpressure 500 100.1606 15.13686
2:          1 bloodpressure 500 100.1606 15.02566

现在注意mean是相同的(即在整个样本中计算而不是按组计算。

> mean(tdt$bloodpressure)
[1] 100.1606

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

行。有了this excellent post很多帮助,我想我有答案......

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]

诀窍是使用.SD.SDcols,然后将所有内容包装在lapply中。

为什么,尽管搜索了多年,但是只有在花费了另一段时间来制作一个我设法找到答案的问题之后呢? https://meta.stackoverflow.com/的问题......