使用ddply进行汇总统计

问题描述 投票:0回答:3

我喜欢使用

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))
)
r dataframe plyr
3个回答
4
投票

正如Nick在他的回答中所写的,你不能使用

$
来引用作为角色名称传递的变量。当您输入
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
投票

这更像你想要的吗?

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
}

0
投票

由于 ddply 现在早已过时,skimr 是获取分组汇总统计数据的快速方法:

> skim(mat %>% group_by(index) %>% select(metric))
Adding missing grouping variables: `index`
── Data Summary ────────────────────────
                           Values                      
Name                       mat %>% group_by(index) %...
Number of rows             10                          
Number of columns          2                           
_______________________                                
Column type frequency:                                 
  numeric                  1                           
________________________                               
Group variables            index                       

── Variable type: numeric ──────────────────────────────────────────────────────────────────
  skim_variable index n_missing complete_rate mean   sd p0 p25 p50 p75 p100 hist 
1 metric        Long          0             1 10.2 3.70  5   8  11  13   14 ▃▃▁▃▇
2 metric        Short         0             1 10.6 3.21  6  10  11  11   15 ▂▁▇▁▂

显示的汇总统计数据,如平均值和四分位数,可以使用

sfl()
进行自定义。

生成的摘要是基于分组变量

index
的长格式。您还可以获得摘要数据框,而不是打印的文本摘要。

© www.soinside.com 2019 - 2024. All rights reserved.