W przypadku Dataframe poniżej, istnieje 59 kolumn

circleid  name  birthday  56 more...
1         1    1       
2         2    10
2         5     68
2         1    10
1         1    1

Wynik Chcę

circleid  distinct_name  distinct_birthday  56 more...
1         1              1       
2         3              2


quiz <- read.csv("https://raw.githubusercontent.com/pranavn91/PhD/master/Expt/circles-removed-na.csv", header = T)

Jak dotąd

ddply(quiz,~circleid,summarise,number_of_distinct_name=length(unique(name)))

To działa dla 1 kolumny Jak uzyskać pełną dataframe

columns <- colnames(quiz)

for (i in c(1:58)
{
final <- ddply(quiz,~circleid,summarise,number_of_distinct_name=length(unique(columns[i])))


}
r
0
pranav nerurkar 5 czerwiec 2018, 10:45

3 odpowiedzi

Najlepsza odpowiedź

Z data.table możesz uruchomić:

library(data.table)
quiz <- fread("https://raw.githubusercontent.com/pranavn91/PhD/master/Expt/circles-removed-na.csv", header = T)
unique_vals <- quiz[, lapply(.SD, uniqueN), by = circleid]
1
pieca 5 czerwiec 2018, 08:16

Możesz użyć dplyr:

result<-quiz%>%
  group_by(circleid)%>%
  summarise_all(n_distinct)

microbenchmark dla data.table i dplyr:

 microbenchmark(x1=quiz[, lapply(.SD, function(x) length(unique(x))), by = circleid],
                x2=quiz%>%
                  group_by(circleid)%>%
                  summarise_all(n_distinct),times=100)
Unit: milliseconds
 expr       min        lq      mean    median        uq       max neval cld
   x1 150.06392 155.02227 158.75775 156.49328 158.38887 224.22590   100   b
   x2  41.07139  41.90953  42.95186  42.54135  43.97387  49.91495   100  a 
1
jyjek 5 czerwiec 2018, 08:07

Z pakietem {x0}} jest to proste. Oryginalna odpowiedź miała length(unique(.)) ale @akrun wskazał mnie do n_distinct(.) w komentarzu.

library(dplyr)

quiz %>%
  group_by(circleid) %>%
  summarise_all(n_distinct)
## A tibble: 2 x 3
#circleid  name birthday
#<int>    <int>    <int>
#  1        1     1
#  2        2     3

dane.

quiz <- read.table(text = "
circleid  name  birthday
1         1    1       
2         2    10
2         5     68
2         1    10
1         1    1
", header = TRUE)
1
Rui Barradas 5 czerwiec 2018, 08:10