【问题标题】:Find non-overlapping values from two tables in R从 R 中的两个表中查找不重叠的值
【发布时间】:2019-07-23 15:48:27
【问题描述】:

我有两张表如下:

library(data.table)
Input<-data.table("Date"=seq(1:10),"Cycle"=c(90,100,130,180,200,230,250,260,300,NA))
Date Cycle
 1:    1    90
 2:    2   100
 3:    3   130
 4:    4   180
 5:    5   200
 6:    6   230
 7:    7   250
 8:    8   260
 9:    9   300
10:   10   320
 FDate<-data.table("Date"=seq(1:9),"Cycle"=c(90,100,130,180,200,230,250,260,300),"Task"=c("D","A","B,C",NA,"A,D","D","C","D","A,C,D"))
   Date Cycle  Task
1:    1    90     D
2:    2   100     A
3:    3   130   B,C
4:    4   180  <NA>
5:    5   200   A,D
6:    6   230     D
7:    7   250     C
8:    8   260     D
9:    9   300 A,C,D

我只想有一个不重叠的Date 和对应的Cycle 的输出表。 我尝试使用setdiff,但它不起作用。我希望我的输出是这样的

Date  Cycle
 10     320

当我尝试这个时setdiff(FDate$Date,Input$Date) 变成这样integer(0)

【问题讨论】:

  • 我对 data.table 的了解不够好,无法确定,但似乎与 this post 相关,它提供了几个选项

标签: r data.table


【解决方案1】:

我们可以使用data.table 中的fsetdiff,方法是只包含两个数据集中的公共列

fsetdiff(Input, FDate[ , names(Input), with = FALSE])
#   Date Cycle
#1:   10   320

或@Frank 提到的加入

Input[!FDate, on=.(Date)]
#   Date Cycle
#1:   10   320

在 OP 的代码中,

setdiff(FDate$Date,Input$Date)

第一个参数来自“FDate”的“日期”列,该列中的所有元素也在主数据“Input$Date”中。因此,它返回integer(0))。如果我们反过来,它将返回 10

【讨论】:

  • 使用反连接:Input[!FDate, on=.(Date)] 假设“非重叠日期”就足够了或Input[!FDate, on=.(Date, Cycle)]
猜你喜欢
  • 2013-09-08
  • 1970-01-01
  • 2016-06-02
  • 1970-01-01
  • 2020-12-22
  • 1970-01-01
  • 1970-01-01
  • 2021-12-16
  • 1970-01-01
相关资源
最近更新 更多