我有一个数据集,受访者可以为同一个问题选择多个答案,其中一个描述了他们的国籍。大多数人只选择了一个类别,而有些人选择了多个类别(包括我将单独报告条目的免费文本条目)。我想知道如何尊重那些选择了多个回答而不扭曲其余数据的人
实际上,我想做的就是从中获得基本的人口统计数据(n, mean, sd等),所以我可以接受样本中不同国籍群体的总数超过参与者的数量(除非有某种原因,这是一个我没有想到的坏主意,在这种情况下,请说明)。我通过as.numeric(),
运行了我的专栏,它响应了一些值被强制为NAs(具有多个响应的值)-我知道如何使用例如gsub(",", "")
来修复此错误,但不是以有意义的方式保留这些人的答案。我在这里看到了几个解决这个问题的方法,但我还是一个R初学者,所以我不确定最好的方法是什么。
我会对任何解决方案感兴趣,其中我可以将那些选择此问题的多个答案作为他们自己的组,以及在他们原来的类别中。例如:一张表:英语:5人,威尔士语:3人,苏格兰语:2人,北爱尔兰语:1人,英国语:4人,其他:0人;一个表,英语:3,威尔士语:1,苏格兰语:1,北爱尔兰语:1,英国语:3,其他:0,多个选择:2。
虚拟数据如下:
Nationality <- c(1, "1,2,3,5", 2, "1,2,5", 1, 1, 3, 5, 5, 4)
我稍后还重新编码数值以显示选择文本,如下所示:
df <- df %>%
mutate(Nationality = recode(Nationality,
'1' = 'English',
'2' = 'Welsh',
'3' = 'Scottish',
'4' = 'Northern Irish',
'5' = 'British',
'6' = 'Other'))
下面是我将运行它以获得人口统计数据的代码:
df %>%
group_by(Nationality) %>%
summarise(n = n()) %>%
mutate(Percentage = round(100*(n / sum(n)), 2))
我尝试将数据集的相关列转换为数字(包括国籍列)
df <- df %>% mutate(across(c(1, 2, 4, 5, 7, 13:57), as.numeric))
,正如预测的那样,返回"Warning: NAs引入强制"。我想过提取列并使用我链接的帖子中的解决方案,但没有任何运气。
之前没有发布过问题,所以如果我需要提供更多的信息,请让我知道。我希望我已经解释得足够好,能够给出问题的要点。
我们可以在此之前将列分隔成更长的列,或者使用str_replace
修改值,然后在使用summary
library(dplyr)
library(stringr)
library(tidyr)
df %>%
mutate(Nationality = str_replace_all(Nationality, c('1' = 'English',
'2' = 'Welsh',
'3' = 'Scottish',
'4' = 'Northern Irish',
'5' = 'British',
'6' = 'Other'))) %>%
separate_longer_delim(Nationality, delim = ",") %>%
group_by(Nationality) %>%
summarise(n = n()) %>%
mutate(Percentage = round(100*(n / sum(n)), 2))
与产出
# A tibble: 5 × 3
Nationality n Percentage
<chr> <int> <dbl>
1 British 4 26.7
2 English 5 33.3
3 Northern Irish 1 6.67
4 Scottish 2 13.3
5 Welsh 3 20