2017-02-11 4 views
0

Для следующего кадра данных образца, мне нужно найти для каждого id - подсчет различных значений для каждого столбцаdataframe - найти подсчет различных значений по столбцам для рядов же значения для одного столбца

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 в not- 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]