rbind 并加入 data.table
rbind and join in data.table
我需要 rbind(.)
两个 data.tables,其中一个比另一个多两列。我想绑定它们,但也填充列。
d1 <- data.table(group=rep(1:2,each=5), no=1:5, x= rep(c(100,200), each=5), y=rnorm(10))
d2 <- data.table(group=rep(1:2,each=2), y=rnorm(4))
> rbind(d1,d2,fill=TRUE)
group no x y
1: 1 1 100 0.018938699
2: 1 2 100 -1.924350449
3: 1 3 100 0.331769790
4: 1 4 100 -0.007978624
5: 1 5 100 -0.216864548
6: 2 1 200 -0.959552464
7: 2 2 200 -0.878798805
8: 2 3 200 -0.671132161
9: 2 4 200 -1.329565254
10: 2 5 200 0.795662872
11: 1 NA NA 0.312083392
12: 1 NA NA -0.485818453
13: 2 NA NA 1.848410165
14: 2 NA NA 1.476295328
最重要的是,x
列的缺失值应以与同一组中所有其他列相同的方式填充。如果可能,应继续 no
列的缺失值。这在 data.table 中可能吗?它似乎是绑定和加入的某种混合,我不知道该怎么做。
您可以通过对 rbind 输出进行一些组操作来做到这一点
out <-
rbind(d1, d2, fill = T)[, `:=`(no = 1:.N, x = x[!is.na(x)][1]), by = group]
out
# group no x y
# 1: 1 1 100 0.54925252
# 2: 1 2 100 1.10898571
# 3: 1 3 100 -0.06352423
# 4: 1 4 100 -0.39246382
# 5: 1 5 100 -0.06599473
# 6: 2 1 200 -0.92048106
# 7: 2 2 200 -0.45606083
# 8: 2 3 200 -1.12622400
# 9: 2 4 200 0.54906549
# 10: 2 5 200 1.11150729
# 11: 1 6 100 -2.03593356
# 12: 1 7 100 -0.22070918
# 13: 2 6 200 -0.48830888
# 14: 2 7 200 -1.36497717
您也可以通过连接来完成此操作(相同的输出)
rbind(d1, d2[d1, on = 'group', `:=`(x = i.x, no = max(i.no))][, no := no + rowid(group)])
我需要 rbind(.)
两个 data.tables,其中一个比另一个多两列。我想绑定它们,但也填充列。
d1 <- data.table(group=rep(1:2,each=5), no=1:5, x= rep(c(100,200), each=5), y=rnorm(10))
d2 <- data.table(group=rep(1:2,each=2), y=rnorm(4))
> rbind(d1,d2,fill=TRUE)
group no x y
1: 1 1 100 0.018938699
2: 1 2 100 -1.924350449
3: 1 3 100 0.331769790
4: 1 4 100 -0.007978624
5: 1 5 100 -0.216864548
6: 2 1 200 -0.959552464
7: 2 2 200 -0.878798805
8: 2 3 200 -0.671132161
9: 2 4 200 -1.329565254
10: 2 5 200 0.795662872
11: 1 NA NA 0.312083392
12: 1 NA NA -0.485818453
13: 2 NA NA 1.848410165
14: 2 NA NA 1.476295328
最重要的是,x
列的缺失值应以与同一组中所有其他列相同的方式填充。如果可能,应继续 no
列的缺失值。这在 data.table 中可能吗?它似乎是绑定和加入的某种混合,我不知道该怎么做。
您可以通过对 rbind 输出进行一些组操作来做到这一点
out <-
rbind(d1, d2, fill = T)[, `:=`(no = 1:.N, x = x[!is.na(x)][1]), by = group]
out
# group no x y
# 1: 1 1 100 0.54925252
# 2: 1 2 100 1.10898571
# 3: 1 3 100 -0.06352423
# 4: 1 4 100 -0.39246382
# 5: 1 5 100 -0.06599473
# 6: 2 1 200 -0.92048106
# 7: 2 2 200 -0.45606083
# 8: 2 3 200 -1.12622400
# 9: 2 4 200 0.54906549
# 10: 2 5 200 1.11150729
# 11: 1 6 100 -2.03593356
# 12: 1 7 100 -0.22070918
# 13: 2 6 200 -0.48830888
# 14: 2 7 200 -1.36497717
您也可以通过连接来完成此操作(相同的输出)
rbind(d1, d2[d1, on = 'group', `:=`(x = i.x, no = max(i.no))][, no := no + rowid(group)])