如何使用dplyr的_join函数合并数据框且无NA值?
问题:合并DataFrame时predict值大量NA且表格冗余的解决办法
问题描述
尝试将第二个DataFrame的predict变量值匹配到第一个DataFrame的mean变量值,使用full_join函数后,结果中除一条记录外其余predict值均为NA,且表格出现冗余扩展。
第一个表格(e1RTbits)
# A tibble: 20 × 6 sd_RT seRT bits valid value mean <dbl> <dbl> <chr> <chr> <chr> <dbl> 1 0.134 0.0291 0.029 invalid 50 0.734 2 0.106 0.0232 0.029 valid 50 0.611 3 0.162 0.0353 0.029 invalid 1 0.812 4 0.143 0.0313 0.029 valid 1 0.675 5 0.129 0.0282 0.29 invalid 50 0.742 6 0.0807 0.0181 0.29 valid 50 0.578 7 0.129 0.0289 0.29 invalid 1 0.798 8 0.141 0.0308 0.29 valid 1 0.667 9 0.162 0.0353 0.53 invalid 50 0.798 10 0.100 0.0219 0.53 valid 50 0.590 11 0.162 0.0353 0.53 invalid 1 0.835 12 0.118 0.0257 0.53 valid 1 0.630 13 0.198 0.0433 0.60 invalid 50 0.798 14 0.101 0.0221 0.60 valid 50 0.595 15 0.148 0.0322 0.60 invalid 1 0.854 16 0.120 0.0261 0.60 valid 1 0.646 17 0.174 0.0379 0.86 invalid 50 0.783 18 0.115 0.0251 0.86 valid 50 0.604 19 0.140 0.0314 0.86 invalid 1 0.830 20 0.133 0.0291 0.86 valid 1 0.650
第二个表格(temp2)
predict mean <dbl> <dbl> 1 0.587 0.604 2 0.800 0.783 3 0.646 0.650 4 0.859 0.851 5 0.593 0.595 6 0.782 0.798 7 0.652 0.646 8 0.841 0.854 9 0.594 0.590 10 0.778 0.798 11 0.654 0.630 12 0.837 0.835 13 0.600 0.591 14 0.761 0.742 15 0.660 0.667 16 0.820 0.819 17 0.606 0.611 18 0.744 0.734 19 0.665 0.675 20 0.804 0.812
原使用代码
temp3 <- full_join(e1RTbits, temp2, by = c("mean", "predict"))
输出结果
# A tibble: 39 × 7 sd_RT seRT bits valid value mean predict <dbl> <dbl> <chr> <chr> <chr> <dbl> <dbl> 1 0.134 0.0291 0.029 invalid 50 0.734 NA 2 0.106 0.0232 0.029 valid 50 0.611 NA 3 0.162 0.0353 0.029 invalid 1 0.812 NA 4 0.143 0.0313 0.029 valid 1 0.675 NA 5 0.129 0.0282 0.29 invalid 50 0.742 NA 6 0.0807 0.0181 0.29 valid 50 0.578 NA 7 0.129 0.0289 0.29 invalid 1 0.798 NA 8 0.141 0.0308 0.29 valid 1 0.667 NA 9 0.162 0.0353 0.53 invalid 50 0.798 NA 10 0.100 0.0219 0.53 valid 50 0.590 0.594 11 0.162 0.0353 0.53 invalid 1 0.835 NA 12 0.118 0.0257 0.53 valid 1 0.630 NA 13 0.198 0.0433 0.60 invalid 50 0.798 NA 14 0.101 0.0221 0.60 valid 50 0.595 NA 15 0.148 0.0322 0.60 invalid 1 0.854 NA 16 0.120 0.0261 0.60 valid 1 0.646 NA 17 0.174 0.0379 0.86 invalid 50 0.783 NA 18 0.115 0.0251 0.86 valid 50 0.604 NA 19 0.140 0.0314 0.86 invalid 1 0.830 NA 20 0.133 0.0291 0.86 valid 1 0.650 NA 21 NA NA NA NA NA 0.604 0.587 22 NA NA NA NA NA 0.783 0.800 23 NA NA NA NA NA 0.650 0.646 24 NA NA NA NA NA 0.851 0.859 25 NA NA NA NA NA 0.595 0.593 26 NA NA NA NA NA 0.798 0.782 27 NA NA NA NA NA 0.646 0.652 28 NA NA NA NA NA 0.854 0.841 29 NA NA NA NA NA 0.798 0.778 30 NA NA NA NA NA 0.630 0.654 31 NA NA NA NA NA 0.835 0.837 32 NA NA NA NA NA 0.591 0.600 33 NA NA NA NA NA 0.742 0.761 34 NA NA NA NA NA 0.667 0.660 35 NA NA NA NA NA 0.819 0.820 36 NA NA NA NA NA 0.611 0.606 37 NA NA NA NA NA 0.734 0.744 38 NA NA NA NA NA 0.675 0.665 39 NA NA NA NA NA 0.812 0.804
错误原因
原代码指定了mean和predict两个连接键,但第一个DataFrame根本没有predict列,导致只有当两列同时匹配时才能成功关联(而第一个DF无predict值,所以几乎全为NA);同时full_join会保留两个DF的所有行,因此出现大量冗余的NA行。
正确解决方案
你的需求是按mean列将第二个DF的predict值匹配到第一个DF,应使用left_join,且仅以mean作为连接键:
temp3 <- left_join(e1RTbits, temp2, by = "mean")
补充说明
第二个DF中存在重复的mean值(比如0.798出现两次),直接匹配会导致第一个DF对应行也重复。如果需要每个mean只保留一个predict值,可先对第二个DF去重:
# 按mean去重,保留每个mean对应的第一个predict值 temp2_unique <- temp2 %>% distinct(mean, .keep_all = TRUE) # 再执行左连接 temp3 <- left_join(e1RTbits, temp2_unique, by = "mean")
内容的提问来源于stack exchange,提问作者Tom_465
相关产品推荐
相关产品推荐

