R 获取数据存在于另一个数据帧中

R 获取数据存在于另一个数据帧中,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

我有以下表格: 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   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使用base
R
,您可以使用
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