data.table:使用with = False和转换函数/汇总函数?

时间:2014-11-10 12:50:26

标签: r data.table lapply summarization group-summaries

我想总结data.table中的几个变量,宽格式输出,输出可能作为每个变量的列表。由于其他几种方法都不起作用,我试图做一个外部的lapply,给出变量的名称作为字符向量。我希望使用= FALSE传递这些内容。

carsx=as.data.table(cars)
lapply( list(speed="speed",dist= "dist"), #error object 'ansvals' not found
    function(x)  carsx[,list(mean(x), min(x), max(x) ), with=FALSE ] ) 

由于这不起作用,我尝试了更简单的方法,没有lapply。

carsx[,list(mean("speed"), min("speed"), max("speed") ), with=FALSE ] #error object 'ansvals' not found

这也不起作用。有没有办法做这样的事情?这种行为是''通缉? (我知道?data.table仅提到选择列,但在我的情况下,能够转换它们也很有用)

  

当= FALSE时,j是要选择的名称或位置的向量,类似于data.frame。 with = FALSE在data.table中通常很有用,可以动态选择列。

EDIT 我的目标是针对不同的变量以宽格式获得每组的摘要。 我尝试扩展以下内容,它仅适用于一个变量,用于变量列表。

carsx[,list(mean(speed), min(speed), max(speed) ) ,by=(dist>50)

可悲的是,SO不允许我发布我的另一个问题。我在那里描述了我想要的输出类似于:

lapply( list(speed="speed",dist= "dist"),
        function(x) do.call("as.data.frame", aggregate(cars[,x], list(class=cars$dist>50), FUN=summary) ) )

预期输出将类似于:

$speed 
         V1       V2 V3
1: FALSE 12.96970  4 20
2:  TRUE 20.11765 14 25

$dist
         V1       V2 V3
1: FALSE 12.96970  4 20
2:  TRUE 20.11765 14 25

2 个答案:

答案 0 :(得分:4)

您可以使用.SDcols参数指定列:

carsx[ , lapply(.SD, function(x) c(mean(x), min(x), max(x))), 
      .SDcols = c("speed", "dist")]
#    speed   dist
# 1:  15.4  42.98
# 2:   4.0   2.00
# 3:  25.0 120.00

carsx[ , lapply(.SD, function(x) c(mean(x), min(x), max(x))), 
      .SDcols = "speed"]
#    speed
# 1:  15.4
# 2:   4.0
# 3:  25.0

答案 1 :(得分:1)

在Svens的基础上回答.SDcols,rbindlist以及外部和内部lapply的组合。内部的lapply是访问.SD的必要条件。

lapply( list(speed="speed",dist= "dist"),
    function(x)  carsx[ , rbindlist(lapply(.SD, function(x) list(mean=mean(x), min=min(x), max=max(x)) )), 
                       .SDcols = x,by= (dist>50)] ) 

结果:

$speed
    dist     mean min max
1: FALSE 12.96970   4  20
2:  TRUE 20.11765  14  25

$dist
    dist     mean min max
1: FALSE 27.84848   2  50
2:  TRUE 72.35294  52 120