2015-09-05 72 views
3

此问题源于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中做到这一点?谢谢!

+0

你可以试试'独特(XYZ​​)' – HubertL

+0

@HubertL当然。这给了独特的组合。但我也知道什么多少有意见在每一个独特的组合中,请问有没有一种简单的方法? – LaTeXFan

回答

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) 
+0

什么包是“长度”的一部分? – pcantalupo

1

使用data.table一个选项。我们转换“data.frame”到“data.table”(​​,由“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