R 按索引移动数据表行
在试图回答时,我遇到了我自己的问题,我自己无法解决。然而,我真的很想为我的问题找到一个有效的解决方案。最初,我将此作为该问题的答案发布,但由于它造成了混乱,我认为单独发布此问题是一个更好的决定: 假设我有以下数据:R 按索引移动数据表行,r,data.table,R,Data.table,在试图回答时,我遇到了我自己的问题,我自己无法解决。然而,我真的很想为我的问题找到一个有效的解决方案。最初,我将此作为该问题的答案发布,但由于它造成了混乱,我认为单独发布此问题是一个更好的决定: 假设我有以下数据: set.seed(1) dat <- data.table(value = seq(1,7),value2 = seq(1,7)) shift_id = c(1,2,3,NA,4,NA,5) 注意,第7行包含第5行的内容,因为shift_id[7]=5 我如何使用DT软件包有
set.seed(1)
dat <- data.table(value = seq(1,7),value2 = seq(1,7))
shift_id = c(1,2,3,NA,4,NA,5)
注意,第7行包含第5行的内容,因为shift_id[7]=5
我如何使用DT软件包有效地实现这一点
非常感谢您的帮助 您可以尝试:
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))]
您可能不需要
dat$
。可以使用lappy
,.SD
,粘贴
和.SDcols
进行概括。是的,我会在答案中添加它!谢谢你的建议。这基本上是一个基本的R特征,通过向量的位置来划分向量。看起来与data.table无关。没错,我只是想知道如何使用DT包。感谢您对答案的反馈!
dat[, paste0(names(dat)[grepl("value", names(dat))], ".shift") := lapply(.SD, `[`, shift_id), .SDcols = grep("value", names(dat))]