使用ddply进行汇总统计

5

我想用ddply编写一个函数,根据data.framemat的两列名称输出汇总统计信息。

  • mat是一个大型data.frame,其中包含列名称"metric"、"length"、"species"、"tree"等等

  • 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))
)

如果您提供了示例数据(最好使用'dput'格式),那么回答这个问题将会更容易。 - Richie Cotton
@Richie- 这是一个玩具示例 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)))- 谢谢 - Tony
1
你可以编辑问题并添加示例数据,而不是写评论(我已经为您完成了;). - Marek
我建议通过传递额外的参数来使您的函数更具普适性,以便对data.frame和要拆分的变量进行操作。这样,当您需要在名为MatMATMyOtherData等数据框上使用它时,您的函数将能够正常工作。 - Chase
1
应该有一个R通用函数来实现这个。甚至支持任意数量的参数。是否有这样的函数? - userJT
2个回答

4
正如Nick在他的回答中所写,您不能使用$来引用作为字符名称传递的变量。当您写X$arg1时,R会在data.frame X中搜索名为"arg1"的列。您可以通过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

这个更符合你的要求吗?

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
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接