如何将两个不同data.table中的列乘以匹配条件?

时间:2019-06-28 22:19:21

标签: r data.table

我有两个关于具有相同ID的相同人口的data.table,一个没有缺失值,而另一个则有几个缺失值。我想将DT1的比率列乘以DT2的数字列。

**DT1**              
*ID__ratio*            
1__ 0.3              
2__ 0.2          
3__ 0.4          
4__ 0.1           
5__ 0.7           
6__ 0.3           
7__ 0.5           
8__ 0.9           
9__ 0.1           
10_ 0.4           

**DT2**  
*ID__ number*  
1__  NA   
2__ NA   
3__ 488  
4__ NA  
5__ NA  
6__ 600  
7__ 789   
8__ 503    
9__ NA  
10__NA    

我已经尝试过matchifelse

result <- DT1$ratio[match(DT1$ID, DT2$ID)] * DT2$number
result <- ifelse(DT1$ID==DT2$ID, DT1$ratio * DT2$number, NA)

它正在运行,但是我收到以下警告:

longer object length is not a multiple of shorter object length

用于“匹配”和“ ifelse”解决方案。

两者的结果均不正确:存在ID的结果,其中DT2中缺少数字数据,而存在NA的结果中,DT2中具有数字数据。

如果我尝试通过以下代码合并DT1和DT2,那么它将起作用:

merged <- merge(DT1, DT2, key = "ID")

1 个答案:

答案 0 :(得分:2)

如果只想返回相乘的向量,就像这样:

require(data.table)

DT1 <- structure(list(ID = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), ratio = c(0.3, 
0.2, 0.4, 0.1, 0.7, 0.3, 0.5, 0.9, 0.1, 0.4)), class = "data.frame", row.names = c(NA, 
-10L))

DT2 <- structure(list(ID = 1:10, number = c(NA, NA, 488L, NA, NA, 600L, 
789L, 503L, NA, NA)), class = "data.frame", row.names = c(NA, 
-10L))

setDT(DT1)
setDT(DT2)

DT1$ratio[match(DT2$ID, DT1$ID)] * DT2$number

注意比赛的顺序。