Суммируйте, но держите переменную длины (dplyr) - PullRequest
0 голосов
/ 10 октября 2018

Основной вопрос dplyr ... Респонденты могут выбрать несколько компаний, которые они используют.Например:

library(dplyr)
test <- tibble(
 CompanyA = rep(c(0:1),5),
 CompanyB = rep(c(1),10),
 CompanyC = c(1,1,1,1,0,0,1,1,1,1)
)
test

Если бы это был вопрос с принудительным выбором - то есть респонденты могли сделать только один выбор - я бы сделал следующее для основной сводной таблицы:

test %>% 
  summarise_all(funs(sum), na.rm = TRUE) %>% 
  gather(Response, n) %>% 
  arrange(desc(n)) %>% 
  mutate("%" = round(100*n/sum(n)))

Обратите внимание, однако, что столбец «%» не то, что я хочу.Вместо этого я ищу долю от общего числа респондентов для каждого отдельного варианта ответа (поскольку они могут сделать несколько выборок).

Я пытался добавить mutate(totalrows = nrow(.)) %>% до summarise_all команда.Это позволило бы мне использовать эту переменную в качестве знаменателя в более поздней команде mutate.Тем не менее, summarise_all устраняет "общее количество" var.

Кроме того, если есть лучший способ сделать это, я открыт для идей.

Ответы [ 3 ]

0 голосов
/ 10 октября 2018

Вот решение с использованием tidyr::gather:

test %>% 
  gather(Company, response) %>% 
  group_by(Company) %>% 
  summarise(`%` = 100 * sum(response) / n())
0 голосов
/ 10 октября 2018

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

test %>% 
  summarise_all(
    list(
      rows = length,
      n = function(x){sum(x, na.rm = T)},
      perc = function(x){sum(x,na.rm = T)/length(x)}
    )) %>%
  tidyr::gather(Response, n) %>%
  tidyr::separate(Response, c("Company", "Metric"), '_') %>%
  tidyr::spread(Metric, n)

И вы получите это

  Company      n  perc  rows
  <chr>    <dbl> <dbl> <dbl>
1 CompanyA     5   0.5    10
2 CompanyB    10   1      10
3 CompanyC     8   0.8    10
0 голосов
/ 10 октября 2018

Чтобы получить долю респондентов, которые выбрали опцию, когда эта переменная является двоичной, вы можете взять среднее.Чтобы сделать это с вашими тестовыми данными, вы можете использовать sapply:

sapply(test, mean)
CompanyA CompanyB CompanyC 
     0.5      1.0      0.8 

Если вы хотите сделать это более сложным способом (скажем, ваши данные не двоично закодированы, но хранятся как 1 и 2 вместо), вы можете сделать это следующим образом:

test %>% 
    gather(key='Company') %>% 
    group_by(Company) %>% 
    summarise(proportion = sum(value == 1) / n())

# A tibble: 3 x 2
  Company  proportion
  <chr>         <dbl>
1 CompanyA        0.5
2 CompanyB        1  
3 CompanyC        0.8
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...