汇总但保持长度可变(dplyr)

时间:2018-10-10 17:55:40

标签: r dplyr summarize

基本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消除了“总计”变量。

此外,如果有更好的方法可以做到这一点,那么我也乐于接受。

3 个答案:

答案 0 :(得分:3)

要获取在该变量为二进制时选择了一个选项的受访者比例,可以取平均值。为此,您可以使用sapply

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

如果您想以更复杂的方式进行此操作(例如,您的数据不是二进制编码的,而是存储为12),则可以使用以下方法: / p>

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

答案 1 :(得分:1)

如果将所有功能汇总放在一个列表中,则它将起作用。不过,您需要快速整理一下。

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

答案 2 :(得分:0)

这是使用tidyr::gather的解决方案:

test %>% 
  gather(Company, response) %>% 
  group_by(Company) %>% 
  summarise(`%` = 100 * sum(response) / n())