2017-07-17 81 views
2

在试图回答this question on 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包?

任何帮助非常感谢!

+0

这基本上是一个基础R通过它的位置对矢量进行子集化的特征。看起来不像data.table相关。 –

+0

的确如此,我只是想知道如何使用DT包来做到这一点。感谢您对答案的反馈! – Florian

回答

2

你可以尝试:

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 

它使用数据表中的特定功能(感谢@大卫Arenburg您的建议),另一种更通用的方法是:

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

非常感谢,效果很棒! – Florian

+0

你可能不需要'dat $'。并可以推广使用'lapply','.SD','paste'和'.SDcols'。 –

+0

没错,我会在答案中加入它!感谢您的建议。 – User2321