计算 R 中向量的多响应答案

Count multi-response answers aginst a vector in R

我有一个来自调查的多回答问题。

数据如下所示:

|respondent| friend          |
|----------|-----------------|
| 001      | John, Mary      |
|002       | Sue, John, Peter|

然后,我想统计每个受访者有多少男性和女性朋友。 我想我需要创建单独的男性和女性名字向量,然后根据这些向量检查朋友列中的每个单元格并计数。

感谢任何帮助。

这应该受到严重警告,因为许多通用名称经常被不同性别使用。这里我以babynames包中美国社保数据中应用的性别作为代理。然后我将它与我的数据合并,并根据可能性得出一个加权计数。在数据集中,包括 Casey、Riley、Jessie、Jackie、Peyton、Jaime、Kerry 和 Quinn 在内的相当常见的名字在性别之间几乎平均分配,所以在我的方法中,这些名字增加了大约一半的女性朋友和一半的男性朋友,这似乎对我来说,当名字本身并没有增加太多关于性别的信息时,这是最明智的做法。

library(tidyverse) # using dplyr, tidyr
gender_freq <- babynames::babynames %>%
  filter(year >= 1930) %>% # limiting to people <= 92 y.o.
  count(name, sex, wt = n) %>%
  group_by(name) %>%
  mutate(share = n / sum(n)) %>%
  ungroup()

tribble(
  ~respondent, ~friend,
  "001", "John, Mary, Riley",
  "002", "Sue, John, Peter") %>%
  separate_rows(friend, sep = ", ") %>%
  left_join(gender_freq, by = c("friend" = "name")) %>%
  count(respondent, sex, wt = share)


## A tibble: 4 x 3
#  respondent sex       n
#  <chr>      <chr> <dbl>
#1 001        F      1.53
#2 001        M      1.47
#3 002        F      1.00
#4 002        M      2.00

假设您有一个将姓名与性别联系起来的列表,您可以拆分 friend 列,将结果与列表合并并总结性别:

library(tidyverse)
df <- tibble(
  respondent = c('001', '002'), 
  friend = c('John, Mary', 'Sue, John, Peter')
)

names_df <- tibble(
  name = c('John', 'Mary', 'Sue','Peter'),
  gender = c('M', 'F', 'F', 'M')
)

df %>% 
  mutate(friend = strsplit(as.character(friend), ", ")) %>% 
  unnest(friend) %>% 
  left_join(names_df, by = c('friend' = 'name')) %>% 
  group_by(respondent) %>% 
  summarise(male_friends = sum(gender == 'M'), 
            female_friends = sum(gender == 'F'))

导致

# A tibble: 2 x 3
  respondent male_friends female_friends
* <chr>             <int>          <int>
1 001                   1              1
2 002                   2              1