【问题标题】:Using data.table to make summary table使用data.table制作汇总表
【发布时间】:2016-04-18 20:54:23
【问题描述】:

工作数据如下:

df <- data.table(Name = c("a","a","b","b","b","c","c"),
             SPP = c("YP","YP","YP","BY","BY","CY","YP"),
             Con = sample(1:20,7))
df
   Name SPP Con
1:    a  YP  18
2:    a  YP   4
3:    b  YP   2
4:    b  BY  15
5:    b  BY  17
6:    c  CY   1
7:    c  YP  20

目标是汇总SPP 中的信息,并按Name 分组。理想的输出应该是这样的:

   Name SPP N V1
1:    a  YP 2  1
2:    b  YP 1  2
3:    b  BY 2  2
4:    c  CY 1  2
5:    c  YP 1  2

其中N 是每个Name 组中每个SPP 的观察数。 V1 是每个Name 组中SPP 类型的总数。例如,在上面的汇总表中,第 2 行和第 3 行显示:b(Name) 有 1 个 YP 和 2 个 BY ( SPP)。 b 中的SPP 类型总数为 2(V1)。

我可以通过以下方式生成汇总表:

m1 <- df[, .(.N), by = .(Name, SPP)]
m2 <- df[,.(length(unique(SPP))), by = Name]
merge(m1,m2,by = c("Name"))

问题是我是否可以在不使用merge 两个表的情况下使用更简洁的data.table 命令生成此汇总表?我试过类似的东西:

m1 <- df[, .(.N, length(unique(SPP))), by = .(Name, SPP)]

它并没有像想要的那样工作。我不知道为什么。有人可以帮我解释一下吗?谢谢!

【问题讨论】:

    标签: r data.table summary


    【解决方案1】:

    这可行,但在我看来太复杂了,嵌套聚合:

    df[, c(.SD[, .N, by=SPP], n_SPP = uniqueN(SPP)), by=Name]
    # or 
    df[, {z = .SD[, .N, by=SPP]; c(z, n_SPP = nrow(z))}, by=Name]
    

    另一种选择是顺序聚合:

    df[, .N, by=.(Name, SPP)][, n_SPP := .N, by=Name][]
    

    【讨论】:

    • 它绝对适用于链接!我只是好奇是否可以找到一种单一的聚合方法以供进一步使用。我会稍等一下,看看有人能提供其他想法,如果没有,你的回答将得到我的投票!谢谢!
    • 是的,您可以随意打开它。我也很想看到更好的方法。
    • 我在 2013 年向马特提出了类似的问题。刚刚在旧电子邮件中找到了答案,这很像你在这里的答案:)
    猜你喜欢
    • 1970-01-01
    • 2019-03-19
    • 2013-05-07
    • 1970-01-01
    • 2016-07-31
    • 2020-10-09
    • 2017-08-19
    • 2019-06-01
    相关资源
    最近更新 更多