Вызов dplyr :: count для нескольких столбцов и возврат результата в длинном формате - PullRequest
2 голосов
/ 02 мая 2019

В основном я хочу сделать это, но сохранить правильный порядок сортировки:

iris %>% 
    gather() %>% 
    group_by(key) %>% 
    count(value)

Но при сбрасывании атрибутов теряется информация о сортировке.

(Под сортировкой я подразумеваю, что количество каждого вида должно быть в порядке уровней факторов, а число каждого числа должно быть в числовом порядке).

Поэтому я подумал, что мне нужно вложить все столбцы, прежде чем я вызову метод collect, чтобы каждый столбец стал списком с одним элементом (dataframe). Как то так, но не работает:

iris %>% 
    summarise_all( function(x) nest(x)) %>% 
    gather() %>% 
    mutate( count_tibbles = map(data, key, function(x) x %>% count(key)))

Есть идеи?

К запросу я добавил пример желаемого результата:

first_column_count   = iris %>% count(value = Sepal.Length)   %>%  mutate( column_name = "Sepal.Length")  
second_column_count  = iris %>% count(value = Sepal.Width )   %>%  mutate( column_name = "Sepal.Width" )  
third_column_count   = iris %>% count(value = Petal.Length)   %>%  mutate( column_name = "Petal.Length")  
fourth_column_count  = iris %>% count(value = Petal.Width )   %>%  mutate( column_name = "Petal.Width" ) 
fifth_column_count   = iris %>% count(value = Species     )   %>%  mutate( column_name = "Species"     )


rbind(first_column_count, second_column_count, third_column_count, fourth_column_count, fifth_column_count) %>%
    select(3,2,1)

Кстати, это очень близко к моей первой попытке:

iris %>% 
    gather() %>% 
    group_by(key) %>% 
    count(value)

Но это только потому, что уровни факторов в ирисе $ Виды отсортированы по алфавиту. Я ищу решение, которое не сортирует по алфавиту, как это делает моя первая попытка, но сортирует факторные переменные в соответствии с их факторными уровнями, а числовые переменные - по их числовому значению (а не по алфавиту). Так что это также будет работать в тех случаях, когда уровни факторов не в алфавитном порядке.

Ответы [ 2 ]

0 голосов
/ 10 мая 2019

Я понимаю, что мой вопрос неясен, потому что вывод из моего примера кода был действительно правильным. Тем не менее, мой пример кода не получит правильный порядок во всех случаях. Код ниже будет:

library(tidyverse)
library(rlang)
iris %>% names() %>% 
   map( function(input_string) {
      var_name_from_input_string = rlang::sym(input_string)
      iris %>% count(category = !!var_name_from_input_string)  %>% mutate(category = as.character(category),
                                                                          var = input_string) %>% select(3,1,2)

   }
) %>% bind_rows() 
0 голосов
/ 02 мая 2019

Если вы исключите Species форму gather(), но включите ее в group_by(), вы можете сохранить сортировку видов.

iris %>% 
  gather(key='key', value = 'value', 1:4) %>% 
  group_by(Species, key) %>% 
  count(value) 

Если вы добавите коэффициент к ключу, вы можете сохранить порядок переменных

iris %>% 
  gather(key='key', value = 'value', 1:4) %>% 
  mutate(key=factor(key, levels = names(iris[,1:4]))) %>% 
  group_by(Species, key) %>% 
  count(value)

Таким образом, вывод выглядит как

# A tibble: 175 x 4
# Groups:   Species, key [12]
   Species key          value     n
   <fct>   <fct>        <dbl> <int>
 1 setosa  Sepal.Length   4.3     1
 2 setosa  Sepal.Length   4.4     3
 3 setosa  Sepal.Length   4.5     1
 4 setosa  Sepal.Length   4.6     4
 5 setosa  Sepal.Length   4.7     2
 6 setosa  Sepal.Length   4.8     5
 7 setosa  Sepal.Length   4.9     4
 8 setosa  Sepal.Length   5       8
 9 setosa  Sepal.Length   5.1     8
10 setosa  Sepal.Length   5.2     3
# ... with 165 more rows

Это то, что вы хотите?

...