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

R语言合并多列并填充NA:将分国家问题列合并为单变量

解决方案:合并分国家的问题列

针对你的需求,有两种简单易懂的方法,适合R新手操作:

方法一:使用tidyverse工具包(推荐,逻辑清晰)

首先确保安装并加载tidyverse:

install.packages("tidyverse")
library(tidyverse)

步骤分解:

  • 将宽格式数据转为长格式:把所有Q1_XX、Q2_XX列堆叠起来,保留country列作为标识
df_long <- df %>%
  pivot_longer(cols = starts_with("Q"), # 选择所有以Q开头的列
               names_to = "question_country", # 新列存储原列名
               values_to = "value") # 新列存储对应的值
  • 拆分列名,分离问题和国家标识:把question_country列拆成question(Q1/Q2)和country_code(UK/FR/ES)
df_long <- df_long %>%
  separate(question_country, into = c("question", "country_code"), sep = "_")
  • 过滤掉NA值:因为每个观测只有对应国家的问题列有值,其余都是NA,过滤后每个country+question组合只会保留一个有效数值
df_long_clean <- df_long %>%
  filter(!is.na(value))
  • 转回宽格式,得到最终结果:把question列转成列名,value作为对应的值
final_df <- df_long_clean %>%
  pivot_wider(names_from = question, values_from = value)

合并后的完整代码:

final_df <- df %>%
  pivot_longer(cols = starts_with("Q"), names_to = "question_country", values_to = "value") %>%
  separate(question_country, into = c("question", "country_code"), sep = "_") %>%
  filter(!is.na(value)) %>%
  pivot_wider(names_from = question, values_from = value)

方法二:基础R方法(无需额外安装包)

利用每行仅对应国家的列有非NA值的特点,直接按问题分组提取非NA值:

# 提取Q1相关列,每行取非NA值
df$Q1 <- apply(df[, grep("Q1_", colnames(df))], 1, function(x) x[!is.na(x)])
# 提取Q2相关列,每行取非NA值
df$Q2 <- apply(df[, grep("Q2_", colnames(df))], 1, function(x) x[!is.na(x)])
# 保留需要的列
final_df <- df[, c("country", "Q1", "Q2")]

关键说明:

  • grep("Q1_", colnames(df))会定位所有列名包含Q1_的列索引
  • apply(..., 1, function(x) x[!is.na(x)])对每行执行操作,取出唯一的非NA值(符合你数据每行仅一个有效值的特点)

两种方法都能得到目标结果:tidyverse方法逻辑清晰,方便后续扩展其他数据处理操作;基础R方法无需额外安装包,适合快速完成需求。

内容的提问来源于stack exchange,提问作者ouroboro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 17:54:53