使用ddply进行汇总统计

时间:2011-04-19 10:00:30

标签: r dataframe plyr

我喜欢使用ddply编写一个函数,该函数根据两列data.frame mat的名称输出摘要统计信息。

  • mat是一个大data.frame,其名称为"metric", "length", "species", "tree", ...,"index"

  • index是2级"Short", "Long"

  • 的因素
  • "metric", "length", "species", "tree"和其他人都是连续变量

功能:

summary1 <- function(arg1,arg2) {
    ...

    ss <- ddply(mat, .(index), function(X) data.frame(
        arg1 = as.list(summary(X$arg1)),
        arg2 = as.list(summary(X$arg2)),
        .parallel = FALSE)

    ss
}

我希望在调用summary1("metric","length")

后输出看起来像这样
Short metric.Min. metric.1st.Qu. metric.Median metric.Mean metric.3rd.Qu. metric.Max. length.Min. length.1st.Qu. length
.Median length.Mean length.3rd.Qu. length.Max. 

....

Long metric.Min. metric.1st.Qu. metric.Median metric.Mean metric.3rd.Qu. metric.Max. length.Min. length.1st.Qu. length
.Median length.Mean length.3rd.Qu. length.Max.

....

目前该功能无法产生所需的输出?应该在这做什么修改?

感谢您的帮助。


这是一个玩具示例

mat <- data.frame(
    metric = rpois(10,10), length = rpois(10,10), species = rpois(10,10),
    tree = rpois(10,10), index = c(rep("Short",5),rep("Long",5))
)

2 个答案:

答案 0 :(得分:4)

作为Nick wrote in his answer,您不能使用$来引用作为字符名称传递的变量。当您撰写X$arg1时,R会在"arg1" data.frame中搜索名为X的列。您可以通过X[,arg1]X[[arg1]]引用它。

如果你想得到很好的命名输出,我建议在下面的解决方案:

summary1 <- function(arg1, arg2) {

    ss <- ddply(mat, .(index), function(X) data.frame(
        setNames(
            list(as.list(summary(X[[arg1]])), as.list(summary(X[[arg2]]))),
            c(arg1,arg2)
            )), .parallel = FALSE)

    ss
}
summary1("metric","length")

玩具数据的输出是:

  index metric.Min. metric.1st.Qu. metric.Median metric.Mean metric.3rd.Qu.
1  Long           5              7            10         8.6             10
2 Short           7              7             9         8.8             10
  metric.Max. length.Min. length.1st.Qu. length.Median length.Mean length.3rd.Qu.
1          11           9             10            11        10.8             12
2          11           4              9             9         9.0             11
  length.Max.
1          12
2          12

答案 1 :(得分:1)

这更像你想要的吗?

summary1 <- function(arg1,arg2) {
ss <- ddply(mat, .(index), function(X){ data.frame(
    arg1 = as.list(summary(X[,arg1])),
    arg2 = as.list(summary(X[,arg2])),
    .parallel = FALSE)})
ss
}