簡體   English   中英

匯總但保持長度可變(dplyr)

[英]Summarise but keep length variable (dplyr)

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消除了“總計”變量。

另外,如果有更好的方法可以做到這一點,那么我也樂於接受。

要獲得在該變量為二元變量時選擇某個選項的受訪者比例,可以取平均值。 為此,您可以使用sapply

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

如果您想以更復雜的方式執行此操作(例如,您的數據不是二進制編碼的,而是存儲為12 ),則可以使用以下方法:

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

如果將所有功能匯總放在一個列表中,那么它將起作用。 不過,您需要快速整理一下。

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

這是使用tidyr::gather的解決方案:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM