Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 按索引移动数据表行_R_Data.table - Fatal编程技术网

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))]