2016-03-14 56 views
0

妥善處理我有這樣一個數據幀:需要得到[R cummax但來港

dput(df1) 
structure(list(x = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 
1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L), y = c(16449L, NA, NA, 
16449L, 16450L, 16451L, NA, NA, 16455L, 16456L, NA, NA, 16756L, 
NA, 16460L, 16464L, 16469L, NA, NA, 16469L)), .Names = c("x", 
"y"), row.names = c(NA, -20L), class = "data.frame") 

我需要變異的y列如下(使用dplyr):

df1 <- mutate(df1, y = ifelse(is.na(y), cummax(y), y)) 

然而,cummax不適合我的情況。如何用一些替代方法獲得相同的效果?

結果輸出的NA行數爲y,其中最後一個非NA值爲y。它們按順序排列。

另外,我想是這樣的,它不工作:

mutate(df1, y = ifelse(is.na(y), max(y[1:row_number()], na.rm = TRUE), y) 

因爲ROW_NUMBER()本身就是通過當前行的1矢量,它產生的錯誤。

編輯:所需的輸出如下:

structure(list(x = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 
1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L), y = c(16449, 16449, 
16449, 16449, 16450, 16451, 16451, 16451, 16455, 16456, 16456, 
16456, 16756, 16756, 16460, 16464, 16469, 16756, 16756, 16469 
)), class = "data.frame", .Names = c("x", "y"), row.names = c(NA, 
-20L)) 
+0

你想要的輸出是什麼? –

+0

將其添加到問題中。抱歉。 – Gopala

回答

3

你可以這樣做:

library(dplyr) 

v = cummax(ifelse(is.na(df1$y), -Inf, df1$y)) #A. Webb suggested -Inf instead of 0, great! 

mutate(df1, y=ifelse(is.na(y), v, y)) 

# x  y 
#1 1 16449 
#2 2 16449 
#3 3 16449 
#4 4 16449 
#5 5 16450 
#6 6 16451 
#7 7 16451 
#8 8 16451 
#9 9 16455 
#10 10 16456 
#11 1 16456 
#12 2 16456 
#13 3 16756 
#14 4 16756 
#15 5 16460 
#16 6 16464 
#17 7 16469 
#18 8 16756 
#19 9 16756 
#20 10 16469 

或者你可以使用data.table

setDT(transform(df1,ix=1:nrow(df1)))[,max(df1$y[1:ix],na.rm=T),by=.(ix)] 
+0

嗯...非常有趣的方式來處理我的問題。它會在這種情況下工作,因爲0在我的數據中不是有效值('y'是日期對象的整數值)。想知道在類似的情況下,'dplyr'中是否有更通用的'滾動'最大或普通滾動窗口解決方案。 – Gopala

+0

您可以使用'-Inf'代替。 –

2

Reduce()會是另一種選擇:

df1 %>% mutate(y.cummax = ifelse(is.na(y) , Reduce(function(x1, x2) { max(x1,x2 ,na.rm =TRUE) } , y , accumulate = TRUE ) , y)) 

    x  y 
1 1 16449 
2 2 16449 
3 3 16449 
4 4 16449 
5 5 16450 
6 6 16451 
7 7 16451 
8 8 16451 
9 9 16455 
10 10 16456 
11 1 16456 
12 2 16456 
13 3 16756 
14 4 16756 
15 5 16460 
16 6 16464 
17 7 16469 
18 8 16756 
19 9 16756 
20 10 16469