5

我喜欢编写一个函数,使用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))
)
4

2 回答 2

4

正如尼克在他的回答中所写,您不能使用$引用作为字符名称传递的变量。当您编写时X$arg1R搜索名为"arg1"in的列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
于 2011-04-19T11:51:14.693 回答
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
}
于 2011-04-19T11:02:46.810 回答