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

如何在R语言中从多列重复数据生成单列输出?

问题描述

我有如下数据:

IDX1X2X3
19494NA
272NANA
387NA87
4NA78NA
5676767

希望从每行的X1-X3中选取唯一值,生成如下格式的输出:

IDX
194
272
387
478
567

我尝试使用unite函数处理,但该函数仅合并数据,无法去除NA值。


解决方案

方法一:dplyr按行处理

利用dplyr的rowwise()按行操作,结合na.omit()剔除NA值,再通过unique()提取唯一值:

library(dplyr)

# 构造示例数据
df <- tibble(
  ID = 1:5,
  X1 = c(94, 72, 87, NA, 67),
  X2 = c(94, NA, NA, 78, 67),
  X3 = c(NA, NA, 87, NA, 67)
)

# 处理数据
df_result <- df %>%
  rowwise() %>%
  mutate(X = unique(na.omit(c(X1, X2, X3)))) %>%
  select(ID, X)

print(df_result)

方法二:基础R实现

用apply按行遍历,直接处理每行的非NA唯一值:

# 构造示例数据
df <- data.frame(
  ID = 1:5,
  X1 = c(94, 72, 87, NA, 67),
  X2 = c(94, NA, NA, 78, 67),
  X3 = c(NA, NA, 87, NA, 67)
)

# 添加X列并处理
df$X <- apply(df[, c("X1", "X2", "X3")], 1, function(x) unique(na.omit(x)))
df_result <- df[, c("ID", "X")]

print(df_result)

方法三:tidyr重塑数据

先将宽表转为窄表,剔除NA后按ID去重,再整理成目标格式:

library(tidyr)
library(dplyr)

# 构造示例数据
df <- tibble(
  ID = 1:5,
  X1 = c(94, 72, 87, NA, 67),
  X2 = c(94, NA, NA, 78, 67),
  X3 = c(NA, NA, 87, NA, 67)
)

# 处理数据
df_result <- df %>%
  pivot_longer(cols = starts_with("X"), names_to = NULL, values_to = "X") %>%
  drop_na(X) %>%
  distinct(ID, X) %>%
  arrange(ID)

print(df_result)

unite函数的作用是将多列合并为一个字符串列,本身不具备剔除NA和提取唯一值的能力,以上三种方法都能精准完成你需要的行内非NA唯一值提取操作。

内容的提问来源于stack exchange,提问作者E-B-2443

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 03:13:09