下面是使用embed
構造比較組和與apply
執行所述比較的基礎R法。
# get a matrix for comparisons
myMat <- embed(df$Column, 11)
在這裏,這將返回
myMat
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11]
[1,] 20 17 16 8 7 9 9 15 14 13 12
[2,] 14 20 17 16 8 7 9 9 15 14 13
[3,] 9 14 20 17 16 8 7 9 9 15 14
[4,] 8 9 14 20 17 16 8 7 9 9 15
[5,] 6 8 9 14 20 17 16 8 7 9 9
[6,] 5 6 8 9 14 20 17 16 8 7 9
[7,] 28 5 6 8 9 14 20 17 16 8 7
所以我們的目標是值了與在每一行的剩餘列的第一列進行比較。現在
as.integer(max.col(myMat) == 1L)
[1] 1 0 0 0 0 0 1
,在NA值的適當數量,這是在myMat減一列數粘性。
df$output2 <- c(rep(NA, ncol(myMat) - 1), as.integer(max.col(myMat) == 1L))
這將返回
df
Column Output output2
1 12 NA NA
2 13 NA NA
3 14 NA NA
4 15 NA NA
5 9 NA NA
6 9 NA NA
7 7 NA NA
8 8 NA NA
9 16 NA NA
10 17 NA NA
11 20 1 1
12 14 0 0
13 9 0 0
14 8 0 0
15 6 0 0
16 5 0 0
17 28 1 1
的max.col
一個優點是,它是相當快的。其最大的缺點之一是它沒有na.rm參數來刪除缺少的值。在缺少值的情況下,這裏是在myMat上使用apply
而不是max.col
的方法。
apply(myMat, 1, function(x) as.integer(all(head(x, 1) > tail(x, -1))))
操作比較函數這裏是產生相同的結果
all(head(x, 1) > tail(x, -1))
功能包括以下
head(x, 1) == max(x) # or
x[1] == max(x)
和
1L == which.max(x)
好吧,如果數據集中有缺失的值,那麼我可以在roll apply中添加這個值? na.rm = TRUE,或者我們可以讓它繼續滾動,如果我們缺少值... –
它將執行您要調用的函數指定的任何操作。所以,如果你使用rollapply做了一個意思,你可以傳遞na.rm = TRUE,如果這是你想要的。 – Dason