首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >data.table子集的条件data.table匹配

data.table子集的条件data.table匹配
EN

Stack Overflow用户
提问于 2019-02-26 08:05:47
回答 2查看 771关注 0票数 1

这篇文章与上一篇文章有关:match rows of two data.tables to fill subset of a data.table

不知道我怎么能把它们整合在一起。在我的情况下,除了DT1的一个列的NA之外,还有几个条件应该适用于合并,但这是行不通的。

代码语言:javascript
复制
> DT1 <- data.table(colA = c(1,1, 2,2,2,3,3), colB = c('A', NA, 'AA', 'B', NA, 'A', 'C'), timeA = c(2,4,3,4,6,1,4))
> DT1
   colA colB timeA
1:    1    A     2
2:    1 <NA>     4
3:    2   AA     3
4:    2    B     4
5:    2 <NA>     6
6:    3    A     1
7:    3    C     4
> DT2 <- data.table(colC = c(1,1,1,2,2,3), timeB1 = c(1,3,6, 2,4, 1), timeB2 = c(2,5,7,3,5,4), colD = c('Z', 'YY', 'AB', 'JJ', 'F', 'RR'))
> DT2
   colC timeB1 timeB2 colD
1:    1      1      2    Z
2:    1      3      5   YY
3:    1      6      7   AB
4:    2      2      3   JJ
5:    2      4      5    F
6:    3      1      4   RR

使用上面提到的相同的指导方针,我想将ColD of DT2合并到colB of DT1中,只用于DT1中colB的NA值,并使用DT1中的timeA在DT2中的timeB1和timeB2之间的colD值。我尝试了以下方法,但是合并没有发生:

代码语言:javascript
复制
 > output <- DT1[DT2, on = .(colA = colC), colB := ifelse(is.na(x.colB) & i.timeB1 <= x.timeA & x.timeA <= i.timeB2, i.colD, x.colB)]
> output
> output
   colA colB timeA
1:    1    A     2
2:    1 <NA>     4
3:    2   AA     3
4:    2    B     4
5:    2 <NA>     6
6:    3    A     1
7:    3    C     4

输出没有任何变化。这是我想要的输出:

代码语言:javascript
复制
> desired_output
   colA colB timeA
1:    1    A     2
2:    1   YY     4   --> should find a match
3:    2   AA     3
4:    2    B     4
5:    2 <NA>     6   --> shouldn't find a match
6:    3    A     1
7:    3    C     4

为什么这个不行?我希望只使用data.table操作,而不使用其他包。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-02-26 08:40:01

colBDT1中的适当更新如下所示:

代码语言:javascript
复制
DT1[is.na(colB), colB := DT2[DT1[is.na(colB)], 
                    on = .(colC = colA, timeB1 <= timeA, timeB2 >= timeA), colD]]
print(DT1)
   colA colB timeA
1:    1    A     2
2:    1   YY     4
3:    2   AA     3
4:    2    B     4
5:    2 <NA>     6
6:    3    A     1
7:    3    C     4

这将索引colBNA的值,并在条件下的联接(如on= ...中定义的)之后,用在colD中找到的匹配值替换缺少的值。

票数 4
EN

Stack Overflow用户

发布于 2019-02-26 08:21:26

也许不是最糟糕的答案,但它完成了任务。我不是数据专家,所以我欢迎改进/建议。

代码语言:javascript
复制
DT1[ is.na(colB), colB := DT1[ is.na(colB), ][ DT2, colB := i.colD, on = c( "colA == colC", "timeA >= timeB1", "timeA <= timeB2")]$colB]

什么是事实:

首先,所有行的子集DT1,其中is.na(colB) = TRUE

然后,使用colB向量更新这些行中的colB值,该值来自DT2上同一行子集的非equi连接结果。

更重要的是,DT1是由引用构成的,所以它在大数据上非常快速,内存效率也很高(我认为)。

代码语言:javascript
复制
   colA colB timeA
1:    1    A     2
2:    1   YY     4
3:    2   AA     3
4:    2    B     4
5:    2 <NA>     6
6:    3    A     1
7:    3    C     4
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54880869

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档