如何合并含重复值的两列并保留对应列数据(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
相关产品推荐
相关产品推荐

