讓我有這樣的日期幀(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」?
我會很樂意提供任何幫助。非常感謝。
非常感謝@a Krün的。這是非常聰明的方式。 – oercim
最後一個問題,爲什麼新列的名稱是「x」insted「y」 – oercim
@oercim因爲我們在數據集上應用了'na.locf',而不是在單個列上應用。它返回原始數據集。假設我們做了'轉換(df2,y = na.locf(na.locf(x,na.rm = FALSE),fromLast = TRUE))' – akrun