在复制其他列的同时将列表作为新行值插入1列

时间:2018-07-27 16:34:37

标签: r data.table rows

如果我有data.table:

d <- data.table(NUM = c(1, 2, 3),
               CLASS = c(1, 1, 1),
               VAR = c(4, 5, 3))

还有一个向量a <- c(7, 9, 10)
如何在将aCLASS中的第一个值取下来并携带下来时,如何将具有1个值的向量NUM添加到列VAR的新行中? >

预期输出:

    NUM    CLASS    VAR
1      1       1      4
2      2       1      5
3      3       1      3
4      1       7      4
5      1       9      4
6      1      10      4

我想找到一种精简的方式来计算除CLASS以外的所有列的第一个值。也许和rbindlist在一起?

2 个答案:

答案 0 :(得分:4)

是的,rbind / rbindlist的工作原理是:

rbind(
  d, 
  d[1, replace(as.list(.SD), names(.SD) == "CLASS", list(a))]
)

   NUM CLASS VAR
1:   1     1   4
2:   2     1   5
3:   3     1   3
4:   1     7   4
5:   1     9   4
6:   1    10   4

或更普遍地说,如果还有其他等长的替换物...

rr = list(CLASS = a, VAR = 1:3)
rbind(
  d, 
  d[1, replace(as.list(.SD), match(names(rr), names(.SD)), rr)]
)

   NUM CLASS VAR
1:   1     1   4
2:   2     1   5
3:   3     1   3
4:   1     7   1
5:   1     9   2
6:   1    10   3

答案 1 :(得分:1)

这可能会帮助:

CLASS <- c(7, 9, 10) 

e <- cbind(NUM=rep(d$NUM[1], nrow(d)), CLASS, VAR=rep(d$VAR[1], nrow(d))) 
e

d <- rbind(d, e)
d

# NUM CLASS VAR
# 1:   1     1   4
# 2:   2     1   5
# 3:   3     1   3
# 4:   1     7   4
# 5:   1     9   4
# 6:   1    10   4