【发布时间】:2014-03-26 07:36:05
【问题描述】:
dplyr 包中的do 函数通常会生成列表。有没有办法根据do 的输入为该列表分配名称?具体来说,我传递了group_by 结果,并希望列表的名称能够指示列表元素对应的组。
这是我想要实现的玩具示例:
> it = data.frame(ind=c("a","a","b","b","c"),var1=c(1,2,3,4,5), var1=c(2,3,4,2,2))
> group_by(it,ind)%.%summarise(min(var1))
Source: local data frame [3 x 2]
ind min(var1)
1 c 5
2 b 3
3 a 1
现在使用do 执行此操作
> do(group_by(it,ind),function(x)min(x[,"var1"]))
[[1]]
[1] 5
[[2]]
[1] 3
[[3]]
[1] 1
理想情况下,名称应为c("c","b","a")。
这可能吗?为什么 dplyr 会反转组的排序?请注意,在我的情况下,do 操作的结果是 lm 对象。
编辑:评论要求提供现实的例子,这就是我的想法。我根据数据(虚拟代码)拟合模型:
res <- do(group_by(data,Index),lm,formula=y~x)
现在我想做各种各样的事情,比如
sapply(res,coef)
所以我想将结果与原始数据集相关联,在这种情况下与系数对应的 Index 相关联。
编辑2:可以使用dlply函数实现所需的行为:
dlply(it,~ind,function(d)min(d[,"var1"]))
$a
[1] 1
$b
[1] 3
$c
[1] 5
attr(,"split_type")
[1] "data.frame"
attr(,"split_labels")
ind
1 a
2 b
3 c
我正在研究是否可以使用 dplyr 复制此行为,最好是在最少干预的情况下。
【问题讨论】:
-
你也可以使用
as.list(by(it, it$ind, function(x) min(x[,'var1'])))来得到你想要的,不需要dplyr。 -
哦,我知道很多方法可以做到这一点,但我特意询问的是 dplyr。
-
@mpiktas 为什么不发布一个您想解决的问题的更现实的例子?