当前位置: 首页 > 知识库问答 >
问题:

如何在数据表中选择同时匹配另一个数据表中两个条件的行?

亢琦
2023-03-14

我有两个数据表 DT1DT2其中 DT1 可能比 DT2 更大,列更多。我想在DT1中选择两列DT1中的行,其中DT1的两列在DT2中两列的同一行中具有完全匹配项。例如

DT1 = data.table(x=rep(c("b","a","c"),each=3), y=c(1,3,6), z=1:9)
DT2 = data.table(f=c("a","b"), g=c(1,3))

输出,DT1子,我正在寻找的是

   x y z
1: a 1 4
2: b 3 2

我的问题是,当我试图子集DT1时,我也会得到那些只有一列匹配的行

> DT1[x%in%DT2$f & y%in%DT2$g]
#    x y z
# 1: b 1 1
# 2: b 3 2
# 3: a 1 4
# 4: a 3 5

我可以用一个笨重的for循环来获得我想要的输出,DT1sub

DT1sub<-c()
for (i in 1:2)
  DT1sub<-rbind(DT1sub,DT1[x==DT2$f[i] & y==DT2$g[i]])
DT1sub

但是我想知道是否有更智能的data.table版本。这可能很简单,但是我无法从示例("data.table")中拼凑出来。

共有3个答案

孔逸春
2023-03-14

上面的答案工作得很好,但我仍然更喜欢使用合并()来完成这个任务,因为它的参数更具表现力:

DT1sub <- merge(
  x = DT1, 
  y = DT2, 
  by.x = c('x', 'y'), by.y = c('f', 'g'), all.x = FALSE, all.y = FALSE)

当然,有些参数是多余的,因为它们是默认设置的,但是以这种方式编写它可以确保您记住是否强加了内/外连接等。

饶元章
2023-03-14

另一个想法是使用setkey

library(data.table)

DT1 = data.table(x=rep(c("b","a","c"),each=3), y=c(1,3,6), z=1:9)
DT2 = data.table(f=c("a","b"), g=c(1,3))

setkey(DT1, x, y)
setkey(DT2, f, g)

DT1[DT2]
#    x y z
# 1: a 1 4
# 2: b 3 2
长孙文栋
2023-03-14

您是否正在寻找:

library(data.table)

DT1sub <- DT1[DT2, on = .(x = f, y = g)]

输出:

   x y z
1: a 1 4
2: b 3 2

这基本上是一个过滤联接-它只保留x中与f中的任何内容匹配的行,对于y,以及g

 类似资料:
  • 问题内容: 是否可以使用其他数据库中的SELECT创建表(在我的开发数据库中)? 我想要类似的东西: 有没有执行此操作的语法,还是我需要首先创建一个数据库链接? 问题答案: 您必须首先创建一个数据链接 。 除非创建数据库链接,否则Oracle无法查询其他数据库。如前所述,如果存在数据库链接,则必须执行以下操作:

  • 我的代码是这样的:我想选择两个表中的数据 和myeclipese给出错误消息: 请帮帮我,我测试了一整夜! 我的MainType实体如下所示: 和映射,如下所示:

  • 我有两张桌子:学生桌和收费桌 学生 费用 我想让学生(谁没有支付费用)为虚构:像这样... 我的代码是: 我在两个月的所有学生中都得到了零值------------------------------------- 修正后,这段代码可以在mysql工作台上运行,但不能在Java应用程序中运行。

  • 我想从具有相同user_id的两个表中获取所有数据,但我不知道要使用什么类型的联接,我想确定查询的语法。 “日程”表:

  • 我有两个表:< code>person_concern和< code>person。它们都有一个< code >代码列,而< code>person有一个< code>dept列。我想从< code>person_concern表中选择数据,其中< code>person表中的< code>dept列= 30。 基本上,表的每一行都有不同的代码,然后将该人员放入一个部门。因此,我可以在表中使用相同

  • 问题内容: 我有2个表,一个包含我需要的最终结果,另一个包含我需要根据设定级别选择的列列表。 例如 : 所以,如果我做以下 然后,基本上我需要使用此select语句中的列名来确定从另一条语句中选择了哪些列。 香港专业教育学院尝试过的方法,我当然知道这是错的,但可以让我对我试图做的事情有所了解。 我试图以一种动态方式构建一个sql查询,该查询可以通过我放在表中的任何列进行更改。 从理论上讲,这应与以