Подсчет уникальных элементов в столбцах данных - PullRequest
0 голосов
/ 05 июня 2018

Для приведенного ниже кадра данных есть 59 столбцов

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

Результат, который я хочу

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)

Пока

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

Это работает для 1 столбцакак получить полный фрейм данных

columns <- colnames(quiz)

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


}

Ответы [ 3 ]

0 голосов
/ 05 июня 2018

С пакетом dplyr это просто.В первоначальном ответе было length(unique(.)), но @akrun указал мне на n_distinct(.) в комментарии.

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

Данные.

quiz <- read.table(text = "
circleid  name  birthday
1         1    1       
2         2    10
2         5     68
2         1    10
1         1    1
", header = TRUE)
0 голосов
/ 05 июня 2018

Вы можете использовать dplyr:

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

microbenchmark для data.table и 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 
0 голосов
/ 05 июня 2018

с data.table вы можете запустить:

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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...