2017-02-11 47 views
0

對於下面的示例數據幀,我需要找到每個id - 不同值的計數爲每列數據幀 - 找到爲同一值的行的列不同的值計數的一列

df <- data.frame(id = c(2,2,3,3,3,1,1,4,4), 
         prop1 = c("A","A","B","B","B","B","B","B","C"), 
         prop2 = c(FALSE,FALSE,FALSE,FALSE,FALSE,TRUE,FALSE,TRUE,FALSE), 
         prop3= c(4,4,3,3,4,5,1,5,1)) 
    > df 
     id prop1 prop2 prop3 
    1 2  A FALSE  4 
    2 2  A FALSE  4 
    3 3  B FALSE  3 
    4 3  B FALSE  3 
    5 3  B FALSE  4 
    6 1  B TRUE  5 
    7 1  B FALSE  1 
    8 4  B TRUE  5 
    9 4  C FALSE  1 

基R優選。

預期輸出格式

> dfDistinctCountByProp 
     id prop1.unq.cnt prop2.unq.cnt prop3.unq.cnt 
    1 1  1    2   2 
    2 2  1    1   1 
    3 3  1    1   2 
    4 4  2    2   2 

回答

2

可以sum的不可─duplicated箱子在aggregate,它可以讓你按id

aggregate(. ~ id, df, function(x){ sum(!duplicated(x)) }) 

## id prop1 prop2 prop3 
## 1 1  1  2  2 
## 2 2  1  1  1 
## 3 3  1  1  2 
## 4 4  2  2  2 

或使用length(unique(...))如果它更有意義給你:

aggregate(. ~ id, df, function(x){length(unique(x))}) # returns identical result 

如果讀者護理,dplyr這將是

library(dplyr) 

df %>% group_by(id) %>% summarise_all(n_distinct) 

或data.table,

library(data.table) 

setDT(df)[, lapply(.SD, uniqueN), by = id] 
相關問題