dplyrdo包中的函数通常生成列表。有没有办法根据输入为该列表分配名称?具体来说,我传递结果,并希望列表的名称能够指示列表元素对应的组。dogroup_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
Run Code Online (Sandbox Code Playgroud)
现在用do
> do(group_by(it,ind),function(x)min(x[,"var1"]))
[[1]]
[1] 5
[[2]]
[1] 3
[[3]]
[1] 1
Run Code Online (Sandbox Code Playgroud)
理想情况下,名称应该是c("c","b","a").
这可能吗?为什么dplyr会颠倒组的排序?请注意,在我的例子中,操作的结果do是一个lm对象。
编辑:评论要求提供现实的例子,这就是我的想法。我根据数据(虚拟代码)拟合模型:
res <- do(group_by(data,Index),lm,formula=y~x)
Run Code Online (Sandbox Code Playgroud)
现在我想做各种各样的事情,比如
sapply(res,coef)
Run Code Online (Sandbox Code Playgroud)
所以我想将结果与原始数据集相关联,在本例中与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
Run Code Online (Sandbox Code Playgroud)
我正在寻找是否可以使用 dplyr 复制这种行为,最好是在最少的干预下进行。
试试这个标记版本do.grouped_df:
do2 <- function (.data, .f, ...) {
if (is.null(attr(.data, "indices"))) {
.data <- dplyr:::grouped_df_impl(.data, attr(.data, "vars"),
attr(.data, "drop"))
}
index <- attr(.data, "indices")
out <- vector("list", length(index))
for (i in seq_along(index)) {
subs <- .data[index[[i]] + 1L, , drop = FALSE]
out[[i]] <- .f(subs, ...)
}
nms <- as.character(attr(.data, "labels")[[1]])
setNames(out, nms)
}
library(gusbfn)
it %.% group_by(ind) %.% do2(function(x) min(x$var1))
Run Code Online (Sandbox Code Playgroud)
这使:
$a
[1] 1
$b
[1] 3
$c
[1] 5
Run Code Online (Sandbox Code Playgroud)
fn$它也可以与 gsubfn 包结合使用,如下所示,以稍微缩短它:
library(dplyr)
library(gsubfn)
it %.% group_by(ind) %.% fn$do2(~ min(x$var1))
Run Code Online (Sandbox Code Playgroud)
给出相同的答案。