2017-10-12 165 views
1

說我有以下data.frame:前後平均的情況下更換NA NA的

t<-c(1,1,2,4,5,4) 
u<-c(1,3,4,5,4,2) 
v<-c(2,3,4,5,NA,2) 
w<-c(NA,3,4,5,2,3) 
x<-c(2,3,4,5,6,NA) 

df<-data.frame(t,u,v,w,x) 

我想與之前和之後表示的情況下的平均值,以取代在NAS NA,除非行開始(行4)或結束(行5)與NA。當該行以NA開始時,我想用以下情況替換NA。當該行以NA結尾時,我想用前一個案例代替NA。

因此,我想我的輸出看起來像:

t<-c(1,1,2,4,5,4) 
u<-c(1,3,4,5,4,2) 
v<-c(2,3,4,5,3.5,2) 
w<-c(3,3,4,5,2,3) 
x<-c(2,3,4,5,6,6) 

df<-data.frame(t,u,v,w,x) 
+0

請不要將您的輸出置於評論中,請編輯您的問題。 – r2evans

+0

試着從'動物園'看''na.aggregate' – akrun

+0

以下情況和以前的情況是什麼意思? –

回答

3

的問題指的是第4行開始NA和行5 NA但實際上輸入的4列df開始與NA結束並且輸入的第5列以NA結束,並且輸入開始或結束的第4行和第5行都不帶有NA,因此我們將假定該列的含義不是行。還有兩個數據幀,在問題中都被命名爲df。顯然,一個人應該表示輸入,而另一個同名的數據框是輸出,但爲了清楚起見,我們已經重複了我們在最後註釋中使用的df的定義。

na.approx在動物園裏這麼做很多。 (如果矩陣結果是OK則省略data.frame()一部分。)

library(zoo) 

data.frame(na.approx(df, rule = 2)) 

,並提供:

t u v w x 
1 1 1 2.0 3 2 
2 1 3 3.0 3 3 
3 2 4 4.0 4 4 
4 4 5 5.0 5 5 
5 5 4 3.5 2 6 
6 4 2 2.0 3 6 

注:爲了清楚起見,我們使用該數據幀作爲輸入以上:

df <- structure(list(t = c(1, 1, 2, 4, 5, 4), u = c(1, 3, 4, 5, 4, 
2), v = c(2, 3, 4, 5, NA, 2), w = c(NA, 3, 4, 5, 2, 3), x = c(2, 
3, 4, 5, 6, NA)), .Names = c("t", "u", "v", "w", "x"), row.names = c(NA, 
-6L), class = "data.frame") 
0
sapply(df, function(x){ 
    replace(x, is.na(x), rowMeans(cbind(c(NA, head(x, -1)), c(x[-1], NA)), na.rm = TRUE)[is.na(x)]) 
}) 
#  t u v w x 
#[1,] 1 1 2.0 3 2 
#[2,] 1 3 3.0 3 3 
#[3,] 2 4 4.0 4 4 
#[4,] 4 5 5.0 5 5 
#[5,] 5 4 3.5 2 6 
#[6,] 4 2 2.0 3 6