我有一张包含一些消费产品的data.table。我将这些产品分为了“低质量”,“高质量”或“未知”的类别。这些数据是时间序列,我想要平滑一些数据中的季节性。如果一个产品在X期的原始分类(由我用来确定质量的算法产生的分类)是“低质量”,但它在X-1期的原始分类是“高质量”,那么我将把该产品重新分类为X期的“高质量”。此过程在某种产品组区分内完成。
为了实现这个目标,我有以下代码:
看一下
因此,我主要希望得到
也就是说,
为了实现这个目标,我有以下代码:
require(data.table)
# lag takes a column and lags it by one period,
# padding with NA
lag <- function(var) {
lagged <- c(NA,
var[1:(length(var)-1)])
return(lagged)
}
set.seed(120)
foo <- data.table(group = c('A', rep(c('B', 'C', 'D'), 5)),
period = c(1:16),
quality = c('unknown', sample(c('high', 'low', 'unknown'), 15, replace = TRUE)))
foo[, quality_lag := lag(quality), by = group]
foo[, quality_1 := ifelse(quality == 'low' & quality_lag == 'high',
'high',
quality)]
看一下
foo
: group period quality quality_lag quality_1
1: A 1 unknown NA unknown
2: B 2 low NA NA
3: C 3 high NA high
4: D 4 low NA NA
5: B 5 unknown low unknown
6: C 6 high high high
7: D 7 low low low
8: B 8 unknown unknown unknown
9: C 9 high high high
10: D 10 unknown low unknown
11: B 11 unknown unknown unknown
12: C 12 low high high
13: D 13 unknown unknown unknown
14: B 14 high unknown high
15: C 15 high low high
16: D 16 unknown unknown unknown
因此,我主要希望得到
quality_1
。如果期间X为'low'
且上一期为'high'
,则我们看到重新分类为'high'
,并且quality
基本保持不变。但是,当quality_lag
为NA时,在quality_1
中'low'
会被重新分类为NA
。这不是'high'
或'unknown'
的问题。也就是说,
foo
的前四行应该是这样的: group period quality quality_lag quality_1
1: A 1 unknown NA unknown
2: B 2 low NA low
3: C 3 high NA high
4: D 4 low NA low
你有什么想法是导致这个问题的原因吗?
data.table
版本大于等于1.9.5已经有了名为shift
的lag
函数,所以你可以简单地执行foo[, quality_lag := shift(quality), by = group]
来实现。 - David Arenburgifelse
函数真的很糟糕,我总是尽量避免使用它。我的建议是像这样做:foo[, quality_1 := quality][quality == 'low' & quality_lag == 'high', quality_1 := "high"]
,来完成同样的功能。 - David Arenburgshift
函数的提示。我会尝试您的建议,因为尽可能减少ifelse
语句的使用确实很有吸引力。 - thagzone