按索引移动数据表行

弗洛里安

尝试在Stack Overflow上回答此问题时,我遇到了自己的单独问题,但我无法解决自己的问题。但是,我真的很想为我的问题找到有效的解决方案。我最初将其发布为该问题的答案,但由于引起了混乱,我认为最好单独发布此问题:

假设我有以下数据:

set.seed(1)
dat <- data.table(value = seq(1,7),value2 = seq(1,7))
shift_id = c(1,2,3,NA,4,NA,5)

我想使用shift_id将行移动到两个新列中,因此所需的输出是:

   value value2 value1.shift value2.shift
1:     1      1            1            1
2:     2      2            2            2
3:     3      3            3            3
4:     4      4            NA            NA
5:     5      5            4            4
6:     6      6            NA            NA
7:     7      7            5            5

请注意,第7行具有第5行的内容,因为shift_id [7] = 5如何使用DT包有效地做到这一点?

任何帮助深表感谢!

用户2321

您可以尝试:

dat[, c("value1.shift", "value2.shift") := list(dat$value[shift_id], dat$value2[shift_id])]

 > dat
   value value2 value1.shift value2.shift
1:     1      1            1            1
2:     2      2            2            2
3:     3      3            3            3
4:     4      4           NA           NA
5:     5      5            4            4
6:     6      6           NA           NA
7:     7      7            5            5

使用数据表特定功能(感谢@David Arenburg的建议)的另一种更通用的方法是:

dat[, paste0(names(dat)[grepl("value", names(dat))], ".shift") := lapply(.SD, `[`, shift_id), .SDcols = grep("value", names(dat))]

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章