通过操作列来扩展data.table

时间:2017-06-18 22:49:10

标签: r data.table

我想对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的副本。

3 个答案:

答案 0 :(得分:1)

您可以在此处将组变量设置为summarizemy.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