首页 > 解决方案 > 如何同时对多个变量使用anti_join?

问题描述

我想从 data2 (异常值)中删除 data1 (血液)中包含的 n 个变量的一些值。

new <- anti_join(blood1, outlier)

我正在使用anti_join,没有“by”选项...结果是:“Joining, by = c("DIM", "PCV", "GLUOX", "COLEST", "UREA", "ca", "P ”、“Mg”、“Na”、“K”、“Cl”、“Zn”、“铜蓝蛋白”、“白蛋白”、“球蛋白”、“GOT”、“GGT”、“胆红素”、“ALP”、 “aptoglobina”、“NEFA”、“BHB”、“creatinina”、“Paraox”、“ROMt”、“SHp”、“FRAP”、“MPO”、“AOPP_C”)”...但不正确,请anti_join保留data1 的所有值。

数据1

DIM PCV GLUOX 
23  14  0.23  
24  15  0.15
28  14  0.01
132  35  0.02
128 12  0.14

数据2

DIM PCV GLUOX 
128 35  0.14
132 NA  0.23 
NA  NA  0.15

我的预期输出是:

DIM PCV GLUOX 
23  14  NA  
24  15  NA
28  14  0.01
NA  NA  0.02
NA  12  NA

标签: rdplyr

解决方案


您可以使用Map此处将df2存在的值df1 替换为NA

df1[] <- Map(function(x, y) replace(x, x %in% y, NA), df1, df2)
df1

#  DIM PCV GLUOX
#1  23  14    NA
#2  24  15    NA
#3  28  14  0.01
#4  NA  NA  0.02
#5  NA  12    NA

或者,如果您需要tidyverse我们可以使用map2_df相同逻辑的解决方案。

purrr::map2_df(df1, df2, ~replace(.x, .x %in% .y, NA))

推荐阅读