假设我有以下示例数据集:
iris <- data.table(iris)[c(1:5,51:55,101:105), list(ID=.I, Species,Sepal.Length)]
那么我想要计算一个分组内的行之间的绝对差异(在这种情况下,物种
)。
iris[ , SL.Diff := c(NA,abs(diff(Sepal.Length))) , by = Species]
目前,我有一个数据集,看起来像下面这样:
ID Species Sepal.Length SL.Diff
1: 1 setosa 5.1 NA
2: 2 setosa 4.9 0.2
3: 3 setosa 4.7 0.2
4: 4 setosa 4.6 0.1
5: 5 setosa 5.0 0.4
6: 6 versicolor 7.0 NA
现在我想计算一个新的变量
Sepal.Length2
,如果SL.Diff
小于0.3,则取下一行的值。iris[ , Sepal.Length2 := ifelse(SL.Diff < 0.3, iris[ID+1]$Sepal.Length, Sepal.Length)]
这个操作可以满足我的需求。但是如果我想进行同样的比较,而不是与下一行进行比较,而是与上一行的值进行比较,该怎么做呢?
iris[ , Sepal.Length3 := ifelse(SL.Diff < 0.3, iris[ID-1]$Sepal.Length, Sepal.Length)]
Sepal.Length3
并没有给出我期望的输出结果。有人知道我在这里做错了什么吗?
ID Species Sepal.Length SL.Diff Sepal.Length2 Sepal.Length3
1: 1 setosa 5.1 NA NA NA
2: 2 setosa 4.9 0.2 4.7 4.9
3: 3 setosa 4.7 0.2 4.6 4.7
4: 4 setosa 4.6 0.1 5.0 4.6
5: 5 setosa 5.0 0.4 5.0 5.0
6: 6 versicolor 7.0 NA NA NA
7: 7 versicolor 6.4 0.6 6.4 6.4
8: 8 versicolor 6.9 0.5 6.9 6.9
9: 9 versicolor 5.5 1.4 5.5 5.5
10: 10 versicolor 6.5 1.0 6.5 6.5
11: 11 virginica 6.3 NA NA NA
12: 12 virginica 5.8 0.5 5.8 5.8
13: 13 virginica 7.1 1.3 7.1 7.1
14: 14 virginica 6.3 0.8 6.3 6.3
15: 15 virginica 6.5 0.2 NA 5.1