2015-09-05 77 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 
相關問題