Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为dplyr do操作的列表输出分配名称_R_Dplyr - Fatal编程技术网

为dplyr do操作的列表输出分配名称

为dplyr do操作的列表输出分配名称,r,dplyr,R,Dplyr,包dplyr中的do函数通常生成列表。是否有方法根据对do的输入为该列表分配名称?具体地说,我通过结果传递group\u,并希望列表的名称能够指示列表元素对应的组 以下是我想要实现的玩具示例: > 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 fra

dplyr中的
do
函数通常生成列表。是否有方法根据对
do
的输入为该列表分配名称?具体地说,我通过结果传递
group\u,并希望列表的名称能够指示列表元素对应的组

以下是我想要实现的玩具示例:

> 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
对象

编辑:评论要求提供现实的例子,以下是我的想法。我根据数据拟合模型(虚拟代码):

因此,我想将结果与原始数据集相关联,在本例中,与系数对应的
索引相关联

编辑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
 mods <- do(group_by(it,ind),function(x)
        data.frame(it=unique(as.character(x$ind)),val=min(x$var1)))

我正在研究是否有可能用dplyr复制这种行为,最好只需最少的干预。

您可以在函数中创建data.frame:

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
 mods <- do(group_by(it,ind),function(x)
        data.frame(it=unique(as.character(x$ind)),val=min(x$var1)))
编辑
mods尝试此标记版本的
do.grouped\u 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))
它还可以与gsubfn包中的
fn$
组合,如下所示,以稍微缩短它:

library(dplyr)
library(gsubfn)

it %.% group_by(ind) %.% fn$do2(~ min(x$var1))

给出同样的答案。

你也可以使用
as.list(by(it,it$ind,function(x)min(x[,'var1']))
来得到你想要的,不需要
dplyr
。哦,我知道很多方法,但我特别问的是dplyr。@mpiktas为什么不发布一个你想解决的问题的更现实的例子呢?谢谢,但是我想得到这个列表,因为理论上列表的元素可以是任意的R对象,一般来说不能轻易地放到data.frame中。所以把
data.frame
改成
list
。。。另外,您的示例中的数据源于frame@mpiktas请参阅我的编辑。当然,从理论上讲,列表可以是任何R对象,但在实践中,很难使用group by action创建不同元素长度的列表。很显然,dplyr的下一个版本将有更复杂的
do
,其中可能包括以下行为:
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))
$a
[1] 1

$b
[1] 3

$c
[1] 5
library(dplyr)
library(gsubfn)

it %.% group_by(ind) %.% fn$do2(~ min(x$var1))