【问题标题】:Subset a data.table by matching columns of another data.table通过匹配另一个 data.table 的列来设置 data.table 的子集
【发布时间】:2016-03-21 13:55:14
【问题描述】:

我一直在寻找一种解决方案,用于使用另一个数据表中某些列的匹配值对数据表进行子集化。

示例如下:

set.seed(2)

dt <- 
        data.table(a = 1:10, 
                   b = rnorm(10), 
                   c = runif(10), 
                   d = letters[1:10])

dt2 <- 
        data.table(a = 5:20, 
                   b = rnorm(16), 
                   c = runif(16), 
                   d = letters[5:20])

这是我需要的结果:

> dt2

 1:  5 -2.311069085 0.62512173 e
 2:  6  0.878604581 0.26030004 f
 3:  7  0.035806718 0.85907312 g
 4:  8  1.012828692 0.43748800 h
 5:  9  0.432265155 0.38814476 i
 6: 10  2.090819205 0.46150111 j

我有从第二个数据表返回的行,其中 a 和 d 匹配,即使 b 和 c 可能不匹配。真实数据是互斥的,我需要匹配三列。

【问题讨论】:

  • 你试过joinon。顺便说一句,请使用set.seed 使您的示例可重现
  • @akrun 我尝试过合并,但我想确保保留所有匹配项而不保留任何不匹配的行。
  • @dc3 你确定这是set.seed(2) 的预期输出?
  • @mtoto - 抱歉已修复。
  • dt2[dt, .SD, nomatch=0L, on="a", .SDcols=names(dt2)] ?

标签: r data.table subset


【解决方案1】:

我们可以使用%in% 来相应地匹配列和子集。

dt2[a %in% dt$a & d %in% dt$d]
#    a           b         c d
#1:  5 -2.31106908 0.6251217 e
#2:  6  0.87860458 0.2603000 f
#3:  7  0.03580672 0.8590731 g
#4:  8  1.01282869 0.4374880 h
#5:  9  0.43226515 0.3881448 i
#6: 10  2.09081921 0.4615011 j

【讨论】:

    【解决方案2】:

    这是一个使用 join 并指定 on 的选项

    na.omit(dt2[dt[, c("a", "d"), with = FALSE], on = c("a", "d")])
    #    a           b         c d
    #1:  5 -2.31106908 0.6251217 e
    #2:  6  0.87860458 0.2603000 f
    #3:  7  0.03580672 0.8590731 g
    #4:  8  1.01282869 0.4374880 h
    #5:  9  0.43226515 0.3881448 i
    #6: 10  2.09081921 0.4615011 j
    

    【讨论】:

    • IIUC 这可以用nomatch 干净地完成。请参阅 OP 的 Q 下的评论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-08
    • 1970-01-01
    • 1970-01-01
    • 2016-02-02
    • 2014-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多