gpt4 book ai didi

r - data.table (R) 中的 Ifelse 行为

转载 作者:行者123 更新时间:2023-12-04 20:39:54 24 4
gpt4 key购买 nike

我有一个充满一些消费品的 data.table。我为产品创建了一些区别 'low' , 'high' , 或 'unknown'质量。数据是时间序列,我有兴趣消除数据中的一些季节性。如果产品的原始分类(由我用来确定质量的算法生成的分类)是 'low' X 期质量,但其原始分类为 'high' X-1 期间的质量,我将该产品重新分类为 'high'期间 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'并且周期 X-1 是 'high' ,我们看到重分类为 'high'quality 开始,一切都保持原样.然而,当 quality_lag不适用, 'low'被重新分类为 NAquality_1 .这不是 '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

关于是什么原因造成的任何想法?

最佳答案

首先,Development version on GitHub已经有一个名为 shift 的有效滞后函数它既可以用作滞后也可以用作领先(并且还有一些附加功能,请参阅 ?shift )。

也看看 here因为 v >= 1.9.5 中现在存在许多其他新函数

所以在 v >= 1.9.5 下我们可以简单地做

foo[, quality_lag := shift(quality), by = group]

尽管即使在 v < 1.9.5 下,您也可以使用 .N而不是以下列方式创建此函数
foo[, quality_lag2 := c(NA, quality[-.N]), by = group]

关于你的第二个问题,我建议避免 ifelse出于多种原因一起指定 here

一种可能的替代方法是,仅使用简单的索引,如
foo[, quality_1 := quality][quality == 'low' & quality_lag == 'high', quality_1 := "high"]

这个解决方案有一点开销,调用 [.data.table两次,但它仍然比 ifelse 高效/安全得多。解决方案。

关于r - data.table (R) 中的 Ifelse 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28223347/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com