2017-05-29 61 views
2

讓我有這樣的日期幀(DF1)與列名X:灌裝NA在數據幀中與R中指定的規則

df1<-as.data.frame(x=c(4,3,2,16,7,8,9,1,12)) 
colnames(df1)<-"x" 
df1[2,1]<-NA 
df1[3,1]<-NA 
df1[4,1]<-NA 

的輸出是:

> df1 
    x 
1 4 
2 NA 
3 NA 
4 NA 
5 7 
6 8 
7 9 
8 1 
9 12 

我想向數據框添加一列。新列(y)將填充NA的最接近的值,高於上面的第一個NA。

的代碼和輸出(這就是我想要的)

df1$y<-na.locf(df1, fromLast = FALSE) 

> df1 
    x x 
1 4 4 
2 NA 4 
3 NA 4 
4 NA 4 
5 7 7 
6 8 8 
7 9 9 
8 1 1 
9 12 12 

注:我不明白爲什麼第二列的名稱爲「x」 alhough我把它定義爲「Y」。

然而,上述方法給出錯誤自然的時候,第一項是NA如下:

df2<-as.data.frame(c(4,3,2,16,7,8,9,1,12)) 
colnames(df2)<-"x" 
df2[1,1]<-NA 
df2[2,1]<-NA 
df2[3,1]<-NA 

> df2 
    x 
1 NA 
2 NA 
3 NA 
4 16 
5 7 
6 8 
7 9 
8 1 
9 12 

當我申請了下面的代碼:

df2$y<-na.locf(df2, fromLast = FALSE) 

我得到下面的錯誤:

Error in `$<-.data.frame`(`*tmp*`, "y", value = list(x = c(16, 7, 8, 9, : 
    replacement has 6 rows, data has 9 

在這種情況下,我只想要na.locf(df2, fromLast =FALSE)的對手。即填寫NA作爲低於NA的第一個值。

所需的輸出是:

x y 
1 NA 16 
2 NA 16 
3 NA 16 
4 16 16 
5 7 7 
6 8 8 
7 9 9 
8 1 1 
9 12 12 

因此,使用tryCatch功能,我寫了下面的代碼:

df2$y<-tryCatch(na.locf(df2, fromLast = FALSE), 
       error=function(err) 
        {na.locf(df2, fromLast = TRUE)}) 

但是,我得到了這樣的錯誤:

Error in `$<-.data.frame`(`*tmp*`, "y", value = list(x = c(16, 7, 8, 9, : 
    replacement has 6 rows, data has 9 

所以在總結問題是:

  • 如果

    數據幀的第一個條目不是NA,然後用第一元件填充NA以上

  • 如果數據幀的第一個條目是NA,然後用下面第一元件填充NA。

我該如何使用R?特別是與tryCatch功能?我也不知道爲什麼第二列的名字看起來是「x」而不是「y」?

我會很樂意提供任何幫助。非常感謝。

回答

2

我們可以做一個雙na.locf與具有選擇權na.rm = FALSE

library(zoo) 
na.locf(na.locf(df2, na.rm = FALSE), fromLast = TRUE) 
# x 
#1 16 
#2 16 
#3 16 
#4 16 
#5 7 
#6 8 
#7 9 
#8 1 
#9 12 

如果我們想有兩列

第一個
transform(df2, y = na.locf(na.locf(x, na.rm = FALSE), fromLast = TRUE)) 
# x y 
#1 NA 16 
#2 NA 16 
#3 NA 16 
#4 16 16 
#5 7 7 
#6 8 8 
#7 9 9 
#8 1 1 
#9 12 12 

注:確保將其分配到一個新對象或對象相同,即df2 <- transform(...

+1

非常感謝@a Krün的。這是非常聰明的方式。 – oercim

+0

最後一個問題,爲什麼新列的名稱是「x」insted「y」 – oercim

+0

@oercim因爲我們在數據集上應用了'na.locf',而不是在單個列上應用。它返回原始數據集。假設我們做了'轉換(df2,y = na.locf(na.locf(x,na.rm = FALSE),fromLast = TRUE))' – akrun