【问题标题】:Summary statistics using ddply使用 ddply 汇总统计信息
【发布时间】:2011-04-19 10:00:29
【问题描述】:

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

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

【问题讨论】:

  • 如果您提供示例数据(最好使用dput),这将更容易回答。
  • @Richie- 这是一个玩具示例mat&lt;-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)))- 谢谢
  • 您可以编辑问题以添加示例数据而不是写评论(我为您完成了;))。
  • 我建议通过为data.frame 和要拆分的变量传递附加参数来使您的函数更通用。这样,当您需要在名为 MatMATMyOtherData 等的 data.frame 上使用它时,您的函数将起作用。
  • 应该有一个 R 通用函数。甚至支持任意数量的论点。有这样的吗?

标签: r dataframe plyr


【解决方案1】:

作为Nick wrote in his answer,您不能使用$ 来引用作为字符名称传递的变量。当您写X$arg1 然后Rdata.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

【讨论】:

    【解决方案2】:

    这更像你想要的吗?

    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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-19
      • 2015-09-22
      • 1970-01-01
      • 2019-12-30
      • 2014-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多