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

如何合并含重复值的两列并保留对应列数据(R语言)

问题:合并wv1和wv2的唯一值并保留对应x1、x2列

原始数据集

wv1 <- c(1,2,3,4, NA, NA, NA)
wv2 <- c(1,1.5,2,2.5,3,3.5,4) 
x1 <- c(0.2,0.5,0.2,0.3,NA,NA,NA) 
x2 <- c(0.3,0.4,0.6,0.4,0.7,0.8,0.9)

library(tidyverse)

df <- as.data.frame(cbind(wv1, x1,wv2, x2))
df
#   wv1  x1 wv2  x2
# 1   1 0.2 1.0 0.3
# 2   2 0.5 1.5 0.4
# 3   3 0.2 2.0 0.6
# 4   4 0.3 2.5 0.4
# 5  NA  NA 3.0 0.7
# 6  NA  NA 3.5 0.8
# 7  NA  NA 4.0 0.9

需求说明

需要合并wv1和wv2的唯一值(最终以wv2的序列为基准),同时保留x1和x2列,期望输出如下:

wv <- wv2
x1 <- c(0.2,NA,0.5,NA,0.2,NA,0.3)
x2 <- x2

df_clean <- cbind(wv, x1,x2)
df_clean
#       wv  x1  x2
# [1,] 1.0 0.2 0.3
# [2,] 1.5  NA 0.4
# [3,] 2.0 0.5 0.6
# [4,] 2.5  NA 0.4
# [5,] 3.0 0.2 0.7
# [6,] 3.5  NA 0.8
# [7,] 4.0 0.3 0.9

尝试过的错误方法

使用merge(df$wv1, df$wv2, all= T)得到了笛卡尔积结果,不符合需求:

merge(df$wv1, df$wv2, all= T)
#     x   y
# 1   1 1.0
# 2   2 1.0
# 3   3 1.0
# 4   4 1.0
# 5  NA 1.0
# 6  NA 1.0
# 7  NA 1.0
# 8   1 1.5
# 9   2 1.5
# 10  3 1.5
# 11  4 1.5
# 12 NA 1.5
# 13 NA 1.5
# 14 NA 1.5
# 15  1 2.0
# 16  2 2.0
# 17  3 2.0
# 18  4 2.0
# 19 NA 2.0
# 20 NA 2.0
# 21 NA 2.0
# 22  1 2.5
# 23  2 2.5
# 24  3 2.5
# 25  4 2.5
# 26 NA 2.5
# 27 NA 2.5
# 28 NA 2.5
# 29  1 3.0
# 30  2 3.0
# 31  3 3.0
# 32  4 3.0
# 33 NA 3.0
# 34 NA 3.0
# 35 NA 3.0
# 36  1 3.5
# 37  2 3.5
# 38  3 3.5
# 39  4 3.5
# 40 NA 3.5
# 41 NA 3.5
# 42 NA 3.5
# 43  1 4.0
# 44  2 4.0
# 45  3 4.0
# 46  4 4.0
# 47 NA 4.0
# 48 NA 4.0
# 49 NA 4.0

简便实现方法

方法1:使用tidyverse工具链

先提取wv1和x1的有效配对,再以wv2为基准做左连接,自动匹配对应x1,无匹配项填充NA:

# 提取wv1与x1的非NA对应关系
wv_x1_pair <- df %>% 
  filter(!is.na(wv1)) %>% 
  select(wv = wv1, x1)

# 构建目标数据集
df_clean <- df %>% 
  select(wv = wv2, x2) %>% 
  left_join(wv_x1_pair, by = "wv") %>% 
  arrange(wv)

# 查看结果
df_clean
#    wv  x2  x1
# 1 1.0 0.3 0.2
# 2 1.5 0.4   NA
# 3 2.0 0.6 0.5
# 4 2.5 0.4   NA
# 5 3.0 0.7 0.2
# 6 3.5 0.8   NA
# 7 4.0 0.9 0.3

方法2:使用base R实现

通过构建映射表,再做左连接:

# 构建wv1与x1的映射表(剔除NA)
wv_x1_map <- na.omit(df[, c("wv1", "x1")])
colnames(wv_x1_map) <- c("wv", "x1")

# 合并到wv2与x2的数据集
df_clean <- merge(
  x = data.frame(wv = df$wv2, x2 = df$x2),
  y = wv_x1_map,
  by = "wv",
  all.x = TRUE
)

# 查看结果
df_clean
#    wv  x2  x1
# 1 1.0 0.3 0.2
# 2 1.5 0.4   NA
# 3 2.0 0.6 0.5
# 4 2.5 0.4   NA
# 5 3.0 0.7 0.2
# 6 3.5 0.8   NA
# 7 4.0 0.9 0.3

说明

之前的merge操作错误是因为直接合并两个向量,R会将它们视为无关联的列,从而生成笛卡尔积。正确思路是先建立wv值与x1的对应关系,再以目标wv序列(wv2)为基准,匹配对应的x1值,同时保留x2的原始数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 07:31:17