查找数据框中的唯一组合数和每个组合中的观察数

时间:2015-09-05 01:20:38

标签: r combinations

这个问题来自a previous question。而不是有两列,如果我们有三列或更多列怎么办?请考虑以下数据。

x <- c(600, 600, 600, 600, 600, 600, 600, 600, 600, 800, 800, 800, 800, 800, 800, 800, 800, 800,
       600, 600, 600, 600, 600, 600, 600, 600, 600, 800, 800, 800, 800, 800, 800, 800, 800, 800,
       600, 600, 600, 600, 600, 600, 600, 600, 600, 800, 800, 800, 800, 800, 800, 800, 800, 800)

y <- c(1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
       80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
       3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3)

z <- c(1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3,
       1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3,
       1, 2, 3, 1, 2, 3)

xyz <- data.frame(cbind(x, y, z))

如果我们将所有列视为具有有限数量级别的因子。我想得到的是x,y和z的每个独特组合中的观察数量。答案是18个独特的组合,每个组合有3个观察结果。我怎么能在R做这个呢?谢谢!

2 个答案:

答案 0 :(得分:4)

tabletabulateinteraction

一起使用
tabulate(with(xyz, interaction(x,y,z)))

table(with(xyz, interaction(x,y,z)))
通过互动

split使用lengths

lengths(split(xyz, with(xyz, interaction(x,y,z))))

aggregate(seq_along(x)~ x+y+z, data=xyz, FUN=length)

答案 1 :(得分:1)

使用data.table的选项。我们将'data.frame'转换为'data.table'(setDT(xyz),按'xyz'列分组,获取每组中的元素数量(.N

library(data.table)
setDT(xyz)[, .N, names(xyz)]$N
#[1] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3

或者使用dplyr,我们按列进行分组,使用n()获取元素数量(summarise)。

library(dplyr)
xyz %>%
    group_by_(.dots=names(xyz)) %>%
    summarise(n=n()) %>%
    .$n
#[1] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3