【问题标题】:Fetch data exist in another data frame获取数据存在于另一个数据框中
【发布时间】:2019-11-19 17:25:35
【问题描述】:

我有以下表格: 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
')

【问题讨论】:

  • 如果您发布所需的输出会很好。我认为您想将 x2 中的所有行与 x1 以及 x1 中与 x2 不匹配的任何行进行匹配。那将是一个完整的加入:merge(x1, x2, all=TRUE)
  • 谢谢。我添加了所需的输出。完全连接不会返回所需的输出。它返回 22 行。

标签: r dplyr


【解决方案1】:

使用基址R,您可以使用merge 左连接以通过键c("var1","var2","var3") 匹配x1x2。然后,您可以通过合并中的相同键反加入 x2 中与 x1 中不匹配的任何内容。您需要确保只选择合并右侧的关键列以及 x1 中缺少的任何列 x2

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))

结果:

> out
   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   y1   z2 0.146 0.000 0.854 0.000     0     0     0     0
3     x   y2   z1 1.000 0.000 0.000 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   y1   z2 0.175 0.052 0.773 0.000     0     0     0     1
7     y   y2   z1 0.987 0.013 0.000 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

data.table

我们重复与上述相同的过程——我们需要将左连接表和反连接表拼凑到一个堆栈中,但使用友好的 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

【讨论】:

  • 非常感谢。我能够部分解决它,但有两列 Ars_7 xds % select(var1, var2, var3) %>% unique() %>% anti_join(x1) %>% inner_join( x2)) xds
  • 我个人觉得dplyr 令人困惑,但如果这对你有用,那就太好了!我正在写一个data.table 解决方案,因为我发现代码更易读。
猜你喜欢
  • 1970-01-01
  • 2020-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 2019-09-20
  • 2022-01-18
相关资源
最近更新 更多