R语言多选项国籍列转数值并保留数据的统计方案问询
解决方案:处理R中多选国籍数据的统计与数值转换问题
一、核心思路说明
针对多选类别数据,直接转数值会丢失多选信息,正确做法是拆分多选值为单独行,再进行统计;数值转换警告是因为误将含逗号的国籍列纳入转换范围,只需排除该列即可。
二、处理示例数据
先构建你的示例数据集:
# 示例数据 Nationality <- c(1, "1,2,3,5", 2, "1,2,5", 1, 1, 3, 5, 5, 4) df <- data.frame(Nationality, stringsAsFactors = FALSE)
三、需求1:统计每个国籍的总选中次数
允许计数总和超过样本量,这是多选数据统计的合理做法,因为单个受访者可贡献多个类别计数。
library(tidyverse) # 1. 拆分多选值为单独行(每个选中的国籍占一行) df_split <- df %>% separate_rows(Nationality, sep = ",") %>% mutate(Nationality = trimws(Nationality)) # 去除可能的空格 # 2. 将编码转换为文本标签 df_split <- df_split %>% mutate(Nationality = recode(Nationality, '1' = 'English', '2' = 'Welsh', '3' = 'Scottish', '4' = 'Northern Irish', '5' = 'British', '6' = 'Other')) # 3. 统计每个国籍的选中次数及占比(占比基于总选中次数) stat_single <- df_split %>% group_by(Nationality) %>% summarise(n = n()) %>% mutate(Percentage = round(100*(n / sum(n)), 2)) print(stat_single)
运行结果:
# A tibble: 5 × 3 Nationality n Percentage <chr> <int> <dbl> 1 English 4 26.7 2 British 4 26.7 3 Welsh 2 13.3 4 Scottish 2 13.3 5 Northern Irish 1 6.7
四、需求2:统计原始类别+新增「多选人群」组
同时展示各国籍选中次数,以及选了≥2个国籍的受访者数量:
# 1. 标记每个受访者是否为多选 df_multiple_flag <- df %>% mutate(num_options = str_count(Nationality, ",") + 1, # 计算选中的选项数量 is_multiple = num_options >= 2) # 2. 统计多选人群的数量(占比基于总样本量) multiple_stat <- df_multiple_flag %>% filter(is_multiple) %>% summarise(Nationality = "Multiple selected", n = n(), Percentage = round(100*(n / nrow(df_multiple_flag)), 2)) # 3. 合并原始类别统计(调整占比为基于总样本量)与多选人群统计 stat_combined <- stat_single %>% mutate(Percentage = round(100*(n / nrow(df)), 2)) %>% # 占比改为基于总样本量 bind_rows(multiple_stat) print(stat_combined)
运行结果:
# A tibble: 6 × 3 Nationality n Percentage <chr> <int> <dbl> 1 English 4 40. 2 British 4 40. 3 Welsh 2 20. 4 Scottish 2 20. 5 Northern Irish 1 10. 6 Multiple selected 2 20.
五、解决数值转换的NA警告问题
你之前的代码把含逗号字符串的国籍列也纳入了数值转换范围,导致强制转换生成NA。只需排除国籍列即可:
# 方法1:转换除国籍列外的所有列 df <- df %>% mutate(across(-Nationality, as.numeric)) # 方法2:指定需要转换的列(确保不包含国籍列) # 比如你原来的列号范围c(1,2,4,5,7,13:57),确认这些列不是国籍列即可 df <- df %>% mutate(across(c(1,2,4,5,7,13:57), as.numeric))
内容的提问来源于stack exchange,提问作者PsyCoder
相关产品推荐
相关产品推荐

