Jul*_*ian 5 r summarization group-summaries lapply data.table
我想总结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 ] )
Run Code Online (Sandbox Code Playgroud)
由于这不起作用,我尝试了更简单的方法,没有lapply.
carsx[,list(mean("speed"), min("speed"), max("speed") ), with=FALSE ] #error object 'ansvals' not found
Run Code Online (Sandbox Code Playgroud)
这也不起作用.有没有办法做这样的事情?这种'与'的行为是否需要?(我知道?data.table只提到选择列,但在我的情况下,能够转换它们也很有用)
当= = FALSE时,j是要选择的名称或位置的向量,类似于data.frame.with = FALSE在data.table中通常很有用,可以动态选择列.
编辑我的目的是针对不同的变量以宽格式获取每组的摘要.我尝试扩展以下内容,它仅适用于一个变量,用于变量列表.
carsx[,list(mean(speed), min(speed), max(speed) ) ,by=(dist>50)
Run Code Online (Sandbox Code Playgroud)
可悲的是SO不允许我发布我的另一个问题.我在那里描述了我想要一个类似的输出:
lapply( list(speed="speed",dist= "dist"),
function(x) do.call("as.data.frame", aggregate(cars[,x], list(class=cars$dist>50), FUN=summary) ) )
Run Code Online (Sandbox Code Playgroud)
预期输出将是这样的:
$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
Run Code Online (Sandbox Code Playgroud)
您可以使用.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
Run Code Online (Sandbox Code Playgroud)
在 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)] )
Run Code Online (Sandbox Code Playgroud)
结果:
$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
Run Code Online (Sandbox Code Playgroud)