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
将“转换为”;由「;对象到R中的数据帧_R_Dataframe_Aggregate - Fatal编程技术网

将“转换为”;由「;对象到R中的数据帧

将“转换为”;由「;对象到R中的数据帧,r,dataframe,aggregate,R,Dataframe,Aggregate,我使用R中的“by”函数分割数据帧,并将函数应用于不同的部分,如下所示: pairwise.compare <- function(x) { Nright <- ... Nwrong <- ... Ntied <- ... return(c(Nright=Nright, Nwrong=Nwrong, Ntied=Ntied)) } Z.by <- by(rankings, INDICES=list(rankings$Rater, rankings$Class), F

我使用R中的“by”函数分割数据帧,并将函数应用于不同的部分,如下所示:

pairwise.compare <- function(x) {
Nright <- ...
Nwrong <- ...
Ntied <- ...
return(c(Nright=Nright, Nwrong=Nwrong, Ntied=Ntied))
}
Z.by <- by(rankings, INDICES=list(rankings$Rater, rankings$Class), FUN=pairwise.compare)
: 4 
: 357 
Nright Nwrong Ntied
     3      0     0
------------------------------------------------------------
: 8 
: 357 
NULL
------------------------------------------------------------
: 10 
: 470 
Nright Nwrong Ntied
     3      4     1 
------------------------------------------------------------ 
: 11 
: 470 
Nright Nwrong Ntied
    12      4     1
  Rater Class Nright Nwrong Ntied
1     4   357      3      0     0
2    10   470      3      4     1
3    11   470     12      4     1
data.frame(do.call("rbind", by(x, column, mean)))
我希望将此结果转换为数据帧(不存在空条目),因此它看起来如下所示:

pairwise.compare <- function(x) {
Nright <- ...
Nwrong <- ...
Ntied <- ...
return(c(Nright=Nright, Nwrong=Nwrong, Ntied=Ntied))
}
Z.by <- by(rankings, INDICES=list(rankings$Rater, rankings$Class), FUN=pairwise.compare)
: 4 
: 357 
Nright Nwrong Ntied
     3      0     0
------------------------------------------------------------
: 8 
: 357 
NULL
------------------------------------------------------------
: 10 
: 470 
Nright Nwrong Ntied
     3      4     1 
------------------------------------------------------------ 
: 11 
: 470 
Nright Nwrong Ntied
    12      4     1
  Rater Class Nright Nwrong Ntied
1     4   357      3      0     0
2    10   470      3      4     1
3    11   470     12      4     1
data.frame(do.call("rbind", by(x, column, mean)))

我该怎么做

函数的
by
返回一个列表,因此您可以执行如下操作:

pairwise.compare <- function(x) {
Nright <- ...
Nwrong <- ...
Ntied <- ...
return(c(Nright=Nright, Nwrong=Nwrong, Ntied=Ntied))
}
Z.by <- by(rankings, INDICES=list(rankings$Rater, rankings$Class), FUN=pairwise.compare)
: 4 
: 357 
Nright Nwrong Ntied
     3      0     0
------------------------------------------------------------
: 8 
: 357 
NULL
------------------------------------------------------------
: 10 
: 470 
Nright Nwrong Ntied
     3      4     1 
------------------------------------------------------------ 
: 11 
: 470 
Nright Nwrong Ntied
    12      4     1
  Rater Class Nright Nwrong Ntied
1     4   357      3      0     0
2    10   470      3      4     1
3    11   470     12      4     1
data.frame(do.call("rbind", by(x, column, mean)))

考虑在plyr包中使用ddply,而不是通过。它处理将列添加到数据框的工作。

旧线程,但对于搜索此主题的任何人:

analysis = by(...)
data.frame(t(vapply(analysis,unlist,unlist(analysis[[1]]))))
unlist()
将获取
by()
输出的元素(在本例中为
analysis
),并将其表示为命名向量。
vapply()
取消列出分析的所有元素,并输出结果。它需要一个伪参数来知道输出类型,这就是
analysis[[1]]
的用途。如果可能的话,您可能需要添加一个检查,以确保分析不是空的。
每个输出都将是一列,因此
t()
将其转换到所需的方向,其中每个分析条目成为一行。

这扩展了Shane使用rbind()的解决方案,但也添加了识别组的列并删除空组,这是问题中要求的两个功能。通过使用基本包函数,不需要其他依赖项,例如plyr

simplify_by_output = function(by_output) {
    null_ind = unlist(lapply(by_output, is.null))  # by() returns NULL for combinations of grouping variables for which there are no data. rbind() ignores those, so you have to keep track of them.
    by_df = do.call(rbind, by_output)  # Combine the results into a data frame.
    return(cbind(expand.grid(dimnames(by_output))[!null_ind, ], by_df))  # Add columns identifying groups, discarding names of groups for which no data exist.
}
我愿意

x = by(data, list(data$x, data$y), function(d) whatever(d))
array(x, dim(x), dimnames(x))

这几乎就是我想要的,我得到了一个包含Nright、Nwrong和Ntied列的数据帧,但它不会生成Rater和Class列。我建议将
成对更改。比较
函数以返回这两个字段。否则,您将不得不使用
lappy
例程(或
plyr
)来获取列表名称和值(这是一个额外的步骤)。看起来plyr实际上比by更简单。在本例中,我只是以前不知道该包。如果data.frame中碰巧有混合类型,则此解决方案不起作用(类似于一列中的字符和另一列中的数字),因为它依赖于
vapply
。在这种特定的情况下,Shane的上述解决方案工作得非常好。令人惊讶的是,这是一个公认的、最高评级的答案,没有任何代码显示如何使用ddply函数进行解算。我认为这应该是一个注释。然后你就有了一个
矩阵
/
数组
>,但不是一个
data.frame