我正在尝试将条件移位填充到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
答案 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