如何在data.table中添加一个过滤和转移的列

时间:2017-12-10 18:55:33

标签: r data.table

我正在尝试将条件移位填充到data.table中的新列中,但移位的值会跳过过滤器i。让我用一个例子来解释。

考虑data.table dt1

set.seed(20)
library(data.table)
dt1<-data.table(c1=sample(1:100,size = 10),c2=sample(101:200,size = 10))
> dt1
    c1  c2
 1: 88 172
 2: 77 176
 3: 28 101
 4: 52 173
 5: 93 119
 6: 94 143
 7:  9 131
 8:  7 111
 9: 31 127
10: 34 175

我想要创建一个新列c3,其值c1向上移动1(滞后移位)c1>50否则移位不必存在,且值为必须复制c1。重要的是要注意,移位必须是向量中没有过滤器的前一个值。

所以我正在看这个输出(所需的输出):

dt1
    c1  c2 c3
 1: 88 172 NA  #shift activated
 2: 77 176 88  #shift activated
 3: 28 101 28  #shift not activated
 4: 52 173 28  #shift activated & filter not activated
 5: 93 119 52
 6: 94 143 93
 7:  9 131  9
 8:  7 111  7
 9: 31 127 31
10: 34 175 34

我尝试了这两个连续的转换来获得所需的dt,

dt1[c1>50,c3:=shift(c1,n = 1,type = "lag")]

dt1[c1<50,c3:=c1]

但输出不正确,如下面张贴的每行前面的注释

  c1  c2 c3
 1: 88 172 NA # correct
 2: 77 176 88 # correct
 3: 28 101 28 # correct
 4: 52 173 77 # incorrect (should be one earlier value ie 28)
 5: 93 119 52 # and rest are all correct
 6: 94 143 93 
 7:  9 131  9
 8:  7 111  7
 9: 31 127 31
10: 34 175 34

2 个答案:

答案 0 :(得分:2)

使用ifelse的解决方案(如果c1大于50,则返回c1,否则返回c1):

library(data.table)
dt1[, c3 := ifelse(c1 > 50, c(NA, c1[-.N]), c1)]
 #   c1  c2 c3
 # 1: 88 172 NA
 # 2: 77 176 88
 # 3: 28 101 28
 # 4: 52 173 28
 # 5: 93 119 52
 # 6: 94 143 93
 # 7:  9 131  9
 # 8:  7 111  7
 # 9: 31 127 31
 # 10: 34 175 34

PS:可能有一种更聪明的方式来c(NA, c1[-.N])

答案 1 :(得分:1)

textField.insertText(" ")是一个巧妙的技巧。

您还可以使用c(NA, c1[-.N])包中的lag

dplyr