18

我正在使用 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)

结果 (Z.by) 如下所示:

: 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

我想要将此结果转换为数据框(不存在 NULL 条目),因此它看起来像这样:

  Rater Class Nright Nwrong Ntied
1     4   357      3      0     0
2    10   470      3      4     1
3    11   470     12      4     1

我怎么做?

4

5 回答 5

19

The by function returns a list, so you can do something like this:

data.frame(do.call("rbind", by(x, column, mean)))
于 2010-04-12T02:55:45.633 回答
6

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

于 2010-04-14T19:50:48.467 回答
4

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

analysis = by(...)
data.frame(t(vapply(analysis,unlist,unlist(analysis[[1]]))))

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

于 2014-02-17T22:34:21.773 回答
3

这扩展了 Shane 使用 rbind() 的解决方案,但还添加了标识组的列并删除了 NULL 组 - 这是问题中要求的两个功能。通过使用基本包函数,不需要其他依赖项,例如 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.
}
于 2015-06-17T18:15:01.580 回答
3

我会做

x = by(data, list(data$x, data$y), function(d) whatever(d))
array(x, dim(x), dimnames(x))
于 2016-09-19T11:44:34.037 回答