计算 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
我有一个来自调查的多回答问题。
数据如下所示:
|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