我想对data.table
中的行子集执行操作,导致行数比我开始时的行数更多。是否有一种简单的方法来扩展原始data.table
以适应这种情况?如果没有,我怎么能做到这一点?
这是我原始数据的样本。
DT <- data.table(my.id=c(1,2,3), unmodified=c("a","b","c"), vals=c("apple",NA,"cat"))
DT
my.id unmodified vals
1: 1 a apple
2: 2 b NA
3: 3 c cat
这是我想要的输出。
DT
my.id unmodified vals
1: 1 a apple
2: 2 b boy
3: 2 b bat
4: 2 b bag
5: 3 c cat
新行也会出现在最后,我不在乎订单。我尝试了DT[my.id == 2, vals := c("boy","bat","bag")]
,但它忽略了最后两个带有警告的条目。
TIA!
编辑:我的原始数据集大约有1000万行,但缺少值的条目只出现一次。如果可能的话,我不想创建data.table
的副本。
答案 0 :(得分:1)
您可以在此处将组变量设置为summarize
和my.id
,以使用unmodified
数据模式。如果长度不匹配,则会在每个组内广播值:
DT[, .(vals = if(my.id == 2) c("boy","bat","bag") else vals), .(my.id, unmodified)]
# my.id unmodified vals
#1: 1 a apple
#2: 2 b boy
#3: 2 b bat
#4: 2 b bag
#5: 3 c cat
答案 1 :(得分:0)
另一种选择是对具有&#39; my.id&#39;的数据集进行子集化。如果是2而不是2,那么rbind
rbind(DT[my.id == 2][, .(my.id, unmodified, vals = c('boy', 'bat',
'bag'))], DT[my.id != 2])[order(my.id)]
# my.id unmodified vals
#1: 1 a apple
#2: 2 b boy
#3: 2 b bat
#4: 2 b bag
#5: 3 c cat
答案 2 :(得分:0)
> DT <- data.table(my.id=c(1,2,3), unmodified=c("a","b","c"), vals=c("apple",NA,"cat"))
> DT
my.id unmodified vals
1: 1 a apple
2: 2 b NA
3: 3 c cat
> DT2 <- data.table(my.id=rep(2,3), unmodified=rep("b",3), vals=c("boy","bat","bag"))
> DT2
my.id unmodified vals
1: 2 b boy
2: 2 b bat
3: 2 b bag
> rbind(DT,DT2)
my.id unmodified vals
1: 1 a apple
2: 2 b NA
3: 3 c cat
4: 2 b boy
5: 2 b bat
6: 2 b bag
> rbind(DT,DT2)[order(my.id),]
my.id unmodified vals
1: 1 a apple
2: 2 b NA
3: 2 b boy
4: 2 b bat
5: 2 b bag
6: 3 c cat
> na.omit(rbind(DT,DT2)[order(my.id),])
my.id unmodified vals
1: 1 a apple
2: 2 b boy
3: 2 b bat
4: 2 b bag
5: 3 c cat