如何在R语言中从多列重复数据生成单列输出?
问题描述
我有如下数据:
| ID | X1 | X2 | X3 |
|---|---|---|---|
| 1 | 94 | 94 | NA |
| 2 | 72 | NA | NA |
| 3 | 87 | NA | 87 |
| 4 | NA | 78 | NA |
| 5 | 67 | 67 | 67 |
希望从每行的X1-X3中选取唯一值,生成如下格式的输出:
| ID | X |
|---|---|
| 1 | 94 |
| 2 | 72 |
| 3 | 87 |
| 4 | 78 |
| 5 | 67 |
我尝试使用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
相关产品推荐
相关产品推荐

