Найти количество переменных на разных уровнях в рамках данных, используя dplyr? - PullRequest
1 голос
/ 07 октября 2019

У меня есть следующий код, и я не уверен, как это будет написано с использованием dplyr

df <- data.frame(
  a = c(1, 1, 1, 2, 2, 2, 2, 2),
  b = c(1, 2, 3, 2, 3, 2, 3, 2),
  c = c(1, 2, 3, 4, 3, 4, 3, 4),
  d = c(1, 2, 3, 4, 5, 4, 5, 4),
  e = c(1, 2, 3, 2, 3, 4, 3, 5)
)

n = 100
results=data.frame(levels=double(),amount=double())
for(i in 1:n){
  r <- df %>% select_if(~n_distinct(.)==i)
  if(dim(r)[2]>0){
    results=rbind(results,data.frame(levels=i,amount=dim(r)[2]))
  }
}
results

, который выводит

  levels amount
1      2      1
2      3      1
3      4      1
4      5      2

Использование цикла for и *Заявление 1009 * заставляет меня думать, что должен быть более хороший подход или, по крайней мере, подход, использующий вместо этого dplyr.

edit

Фрейм данных с различными типами

df <- data.frame(
  a = c(1, 1, 1, 2, 2, 2, 2, 2),
  b = c(1, 2, 3, 2, 3, 2, 3, 2),
  c = c(1, 2, 3, 4, 3, 4, 3, 4),
  d = c(1, 2, 3, 4, 5, 4, 5, 4),
  e = c(1, 2, 3, 2, 3, 4, 3, 5),
  f = c('a','b','a','a','a','a','a','b')
)

Ответы [ 4 ]

3 голосов
/ 07 октября 2019
library(dplyr)
library(tidyr)
df %>%
    summarise_all(.funs = function(x) length(unique(x))) %>%
    pivot_longer(everything()) %>%  #OR gather %>%
    count(value)
3 голосов
/ 07 октября 2019

Один dplyr и tidyr Возможны следующие варианты:

df %>%
 pivot_longer(everything()) %>%
 group_by(name) %>%
 summarise(n_levels = n_distinct(value)) %>%
 ungroup() %>%
 count(n_levels)

  n_levels     n
     <int> <int>
1        2     1
2        3     1
3        4     1
4        5     2
2 голосов
/ 07 октября 2019

Базовый подход R может быть:

stack(table(sapply(df, function(x) length(unique(x)))))

#  ind values
#1   2      1
#2   3      1
#3   4      1
#4   5      2
1 голос
/ 07 октября 2019

Я думаю, что это лучший способ сделать то, что вы хотите. Использование dplyr и purr.

library(tidyverse)

df <- data.frame(
  a = c(1, 1, 1, 2, 2, 2, 2, 2),
  b = c(1, 2, 3, 2, 3, 2, 3, 2),
  c = c(1, 2, 3, 4, 3, 4, 3, 4),
  d = c(1, 2, 3, 4, 5, 4, 5, 4),
  e = c(1, 2, 3, 2, 3, 4, 3, 5)
)

map_df(df, function(d){
              data.frame(level = n_distinct(d))
           }) %>% 
group_by(level) %>% 
summarise(amount = n())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...