Tôi có một data.table đầy đủ của một số sản phẩm tiêu dùng. Tôi đã tạo ra một số khác biệt cho các sản phẩm là 'low'
, 'high'
hoặc chất lượng 'unknown'
. Dữ liệu là chuỗi thời gian và tôi quan tâm đến việc làm mịn một số tính thời vụ trong dữ liệu. Nếu phân loại thô của sản phẩm (phân loại được phân loại theo thuật toán tôi đã sử dụng để xác định chất lượng) là 'low'
chất lượng trong khoảng thời gian X, nhưng phân loại thô của nó là 'high'
chất lượng trong khoảng thời gian X-1, tôi phân loại lại sản phẩm đó là 'high'
chất lượng trong khoảng thời gian X. Quá trình này được thực hiện trong một số loại phân biệt nhóm sản phẩm.Hành vi ifelse trong data.table (R)
Để thực hiện điều này, tôi đã có một cái gì đó như sau:
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)]
Lấy một cái nhìn tại 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
Vì vậy, quality_1
chủ yếu là những gì tôi muốn. Nếu khoảng thời gian X là 'low'
và khoảng thời gian X-1 là 'high'
, chúng tôi thấy việc phân loại lại thành 'high'
xảy ra và mọi thứ còn lại chủ yếu còn nguyên vẹn từ quality
. Tuy nhiên, khi quality_lag
là NA, 'low'
được phân loại lại thành NA
trong quality_1
. Đây không phải là vấn đề với 'high'
hoặc 'unknown'
.
Đó là, bốn hàng đầu tiên của foo
nên trông như thế này:
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
Bất kỳ suy nghĩ về những gì đang gây ra điều này?
Để bắt đầu, bạn không cần phải tái tạo lại bánh xe. 'data.table' v> = 1.9.5 đã có hàm' lag' được gọi là 'shift', vì vậy bạn chỉ có thể thực hiện' foo [, quality_lag: = shift (chất lượng), bởi = group] ' –
Thứ hai,' ifelse' thực sự là một chức năng bất chính và tôi luôn cố gắng tránh nó. Lời khuyên của tôi sẽ chỉ làm một cái gì đó như 'foo [, quality_1: = quality] [chất lượng == 'thấp' & quality_lag == 'cao', chất lượng_1: =" cao "]' –
@DavidArenburg 's điểm là chết trên. Ngoài ra, hãy xem http://stackoverflow.com/q/16275149/1492421 để biết thêm thông tin về ifelse –