2016-07-14 37 views
-2

我有可以被描述爲數據...在R中,如何計算基於另一個因子的因子的唯一值?

factor1 <- c(rep("A", 5), rep("B", 5), rep("C", 5)) 
factor2 <- c("title1", "title1", "title2", "title2", "title3", 
      "title4", "title4", "title4", "title4", "title5", 
      "title6", "title6", "title6", "title6", "title6") 

df <- data.frame(factor1, factor2) 

...和我想是的在factor1每個級別有多少唯一值factor2發生計數。因此,在這種情況下,我期望的輸出將是:

A 3 
B 2 
C 1 

什麼是最有效的(因爲有光澤稍後會參與)函數來做到這一點?我在tablextabsaggregate的各種嘗試都因兩欄都是因素而被挫敗。

+0

實際上'cbind'是製作一個字符矩陣,而不是一個data.frame的因素。如果你把它放在一個data.frame中,那麼這個因素並沒有什麼不同:'table(unique(data.frame(df))$ factor1)' – alistaire

+0

編輯表明我知道數據幀是什麼。 – mmyoung77

回答

2

使用基地-R的tapply你可以這樣做:

tapply(factor2, factor1, function(x) length(unique(x))) 

什麼結果

A B C 
3 2 1 

Usind data.table可以按如下方式做到這一點:

require(data.table) 
DT <- data.table(df) 
DT[,uniqueN(factor2), factor1] 

結果

factor1 V1 
1:  A 3 
2:  B 2 
3:  C 1 

感謝@ytk的建議使用uniqueN

+1

您可以使用'uniqueN'而不是'length(unique(...))'。 – ytk

+0

@ytk謝謝。剛剛添加它 – Rentrop

+1

而不是計算每個組的'unique()',使用'with(unique(df),tapply(factor2,factor1,length))'' –

0

你可以只使用uniquetable

table(unique(df)$factor1) # piped: df %>% unique() %>% `[`('factor1') %>% table() 

## A B C 
## 3 2 1 

或關閉表成data.frame如果你喜歡它長形式:

as.data.frame(table(unique(df)$factor1)) 

## Var1 Freq 
## 1 A 3 
## 2 B 2 
## 3 C 1