You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 11:00:35