R 获取数据存在于另一个数据帧中
我有以下表格: DF1R 获取数据存在于另一个数据帧中,r,dplyr,R,Dplyr,我有以下表格: DF1 var1 var2 var3 Ars_0 Ars_1 Ars_2 Ars_3 Ars_4 Ars_5 Ars_6 Ars_7 x y1 z1 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.000 x y2 z1 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.000 x
var1 var2 var3 Ars_0 Ars_1 Ars_2 Ars_3 Ars_4 Ars_5 Ars_6 Ars_7
x y1 z1 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.000
x y2 z1 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.000
x y1 z2 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.000
x y2 z2 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.000
y y1 z1 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000
y y2 z1 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000
y y1 z2 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000
y y2 z2 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000
z y1 z1 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000
z y2 z1 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000
z y1 z2 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000
z y2 z2 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000
DF2
var1 var2 var3 Ars_0 Ars_1 Ars_2 Ars_3 Ars_4 Ars_5 Ars_6
x y1 z1 0.935 0.065 0.000 0.000 0.000 0.000 0.000
x y2 z1 1.000 0.000 0.000 0.000 0.000 0.000 0.000
x y1 z2 0.146 0.000 0.854 0.000 0.000 0.000 0.000
x y2 z2 0.520 0.377 0.103 0.000 0.000 0.000 0.000
y y1 z1 0.939 0.060 0.000 0.001 0.000 0.000 0.000
y y2 z1 0.987 0.013 0.000 0.000 0.000 0.000 0.000
y y1 z2 0.175 0.052 0.773 0.000 0.000 0.000 0.000
y y2 z2 0.000 0.000 1.000 0.000 0.000 0.000 0.000
z y1 z1 0.948 0.052 0.000 0.000 0.000 0.000 0.000
z y2 z1 0.981 0.019 0.000 0.000 0.000 0.000 0.000
我想要DF2中的所有行以及DF2中不存在但DF1中存在的行(基于var1、var2和var3)。如果列不存在,则应获取整个列。例如,Ars_7存在于DF1中,但不存在于DF2中,因此可以在最终输出中添加整体
所需输出
var1 var2 var3 Ars_0 Ars_1 Ars_2 Ars_3 Ars_4 Ars_5 Ars_6 Ars_7
x y1 z1 0.935 0.065 0.000 0.000 0.000 0.000 0.000 0.000
x y2 z1 1.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
x y1 z2 0.146 0.000 0.854 0.000 0.000 0.000 0.000 0.000
x y2 z2 0.520 0.377 0.103 0.000 0.000 0.000 0.000 0.000
y y1 z1 0.939 0.060 0.000 0.001 0.000 0.000 0.000 1.000
y y2 z1 0.987 0.013 0.000 0.000 0.000 0.000 0.000 1.000
y y1 z2 0.175 0.052 0.773 0.000 0.000 0.000 0.000 1.000
y y2 z2 0.000 0.000 1.000 0.000 0.000 0.000 0.000 1.000
z y1 z1 0.948 0.052 0.000 0.000 0.000 0.000 0.000 1.000
z y2 z1 0.981 0.019 0.000 0.000 0.000 0.000 0.000 1.000
z y1 z2 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000
z y2 z2 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000
R代码
x1 <- read.table(header = TRUE,
text='var1 var2 var3 Ars_0 Ars_1 Ars_2 Ars_3 Ars_4 Ars_5 Ars_6
x y1 z1 0.935 0.065 0.000 0.000 0.000 0.000 0.000
x y2 z1 1.000 0.000 0.000 0.000 0.000 0.000 0.000
x y1 z2 0.146 0.000 0.854 0.000 0.000 0.000 0.000
x y2 z2 0.520 0.377 0.103 0.000 0.000 0.000 0.000
y y1 z1 0.939 0.060 0.000 0.001 0.000 0.000 0.000
y y2 z1 0.987 0.013 0.000 0.000 0.000 0.000 0.000
y y1 z2 0.175 0.052 0.773 0.000 0.000 0.000 0.000
y y2 z2 0.000 0.000 1.000 0.000 0.000 0.000 0.000
z y1 z1 0.948 0.052 0.000 0.000 0.000 0.000 0.000
z y2 z1 0.981 0.019 0.000 0.000 0.000 0.000 0.000
')
x2 <- read.table(header = TRUE,
text='var1 var2 var3 Ars_0 Ars_1 Ars_2 Ars_3 Ars_4 Ars_5 Ars_6 Ars_7
x y1 z1 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.000
x y2 z1 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.000
x y1 z2 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.000
x y2 z2 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.000
y y1 z1 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000
y y2 z1 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000
y y1 z2 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000
y y2 z2 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000
z y1 z1 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000
z y2 z1 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000
z y1 z2 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000
z y2 z2 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000
')
x1使用baseR
,您可以使用merge
左连接,通过键c(“var1”、“var2”、“var3”)匹配x1
和x2
。然后,您可以通过合并中的相同键反连接x2
中与x1
中不匹配的任何内容。您需要确保只选择合并右侧的键列以及x2
中x1
中缺少的任何列:
cols <- c("var1","var2","var3") # keys
missingCol <- setdiff(names(x2), names(x1)) # column(s) missing in x1 but that exist in x2
# left-join for the first component
a <- merge(x1, x2[c(cols, missingCol)], all.x=TRUE, by = c("var1","var2","var3"))
# anti join x2 on x1, see the use of `interaction`
b <- x2[!interaction(x2[cols]) %in% interaction(x1[cols]), ]
# "stack" tables with rbind
out <- do.call(rbind, list(a, b))
带有数据。表
我们重复与上面相同的过程-我们需要将左连接表和反连接表拼合在一个堆栈中,但要使用友好的语法data.table
及其通常的计算效率:
# data.table solution
library(data.table)
cols <- c("var1","var2","var3") # keys
missingCol <- setdiff(names(x2), names(x1)) # column(s) missing in x1 but that exist in x2
setDT(x1) # need to use `setDT` to make data.frames into data.table objects
setDT(x2)
a <- x2[, c(cols, missingCol), with=F][x1, on=cols] # left join
b <- x2[!x1, on=cols] # anti join
res3 <- rbindlist(list(a, b), use.names = TRUE) # bind rows
setcolorder(res3, names(x2)) # order columns as x2
如果您发布所需的输出,那就太好了。我认为您希望将x2中的所有行与x1加上x1中与x2中不匹配的任何行进行匹配。这将是一个完整的连接:merge(x1,x2,all=TRUE)
谢谢。我已添加了所需的输出。完全联接不会返回所需的输出。它返回22行。非常感谢。我可以部分解决这个问题,但是有两列Ars_7 xds%select(var1,var2,var3)%%>%unique()%%>%anti_-join(x1)%%>%internal_-join(x2))xds我个人觉得dplyr
让人困惑,但如果这对你有效,那就太好了!我正在写一个data.table
解决方案,因为我发现代码更清晰。
# data.table solution
library(data.table)
cols <- c("var1","var2","var3") # keys
missingCol <- setdiff(names(x2), names(x1)) # column(s) missing in x1 but that exist in x2
setDT(x1) # need to use `setDT` to make data.frames into data.table objects
setDT(x2)
a <- x2[, c(cols, missingCol), with=F][x1, on=cols] # left join
b <- x2[!x1, on=cols] # anti join
res3 <- rbindlist(list(a, b), use.names = TRUE) # bind rows
setcolorder(res3, names(x2)) # order columns as x2
> res3
var1 var2 var3 Ars_0 Ars_1 Ars_2 Ars_3 Ars_4 Ars_5 Ars_6 Ars_7
1: x y1 z1 0.935 0.065 0.000 0.000 0 0 0 0
2: x y2 z1 1.000 0.000 0.000 0.000 0 0 0 0
3: x y1 z2 0.146 0.000 0.854 0.000 0 0 0 0
4: x y2 z2 0.520 0.377 0.103 0.000 0 0 0 0
5: y y1 z1 0.939 0.060 0.000 0.001 0 0 0 1
6: y y2 z1 0.987 0.013 0.000 0.000 0 0 0 1
7: y y1 z2 0.175 0.052 0.773 0.000 0 0 0 1
8: y y2 z2 0.000 0.000 1.000 0.000 0 0 0 1
9: z y1 z1 0.948 0.052 0.000 0.000 0 0 0 1
10: z y2 z1 0.981 0.019 0.000 0.000 0 0 0 1
11: z y1 z2 1.000 1.000 1.000 1.000 1 1 1 1
12: z y2 z2 1.000 1.000 1.000 1.000 1 1 1 1