2017-10-13 99 views
-2
結束

說我有一個data.frame:前後NA後,平均的情況下更換NA,除非行開始或NA

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

    t u v w x 
1 1 1 2 2 2 
2 1 3 3 3 3 
3 2 4 4 4 4 
4 4 6 NA 5 5 
5 NA 4 3 2 6 
6 3 2 2 3 NA 

我想改變的NA,使得成爲NA由NA之前的一個值和NA之後的一個值的平均值代替。但是,如果一行以NA開始,我希望它被替換爲後面的值。當一行以NA結尾時,我希望它被NA之前的值替換。因此,我想得到以下結果:

t u v w x 
1 1 1 2 2 2 
2 1 3 3 3 3 
3 2 4 4 4 4 
4 4 6 5.5 5 5 --> NA becomes average of 6 and 5 
5 4 4 3 2 6 --> NA becomes value of next case 
6 3 2 2 3 3 --> NA becomes value of previous case 

我有成千上萬的行,所以任何幫助都非常感謝!

回答

0

基於以前na.approx的解決方案,這可能做的伎倆:

library(zoo) 
t(apply(df, 1,function(x) na.approx(x,rule=2))) 
+0

這確實有竅門!你是一個真正的英雄。 –

+0

我得到這個錯誤'na.approx(x,rule = 2)錯誤:找不到函數「na.approx」' –

+1

'library(zoo)'please。包括那 – Sotos

0

始終在您使用的函數中搜索參數na.rm = T. 在這種情況下,您希望使用na.rm參數設置爲true的列之一的平均值。 然後你想替換NA-s。

dt[is.na(dt[,'t']),'t'] = 0 

(假設我沒有扭轉維度的順序)

0

這裏是一個可能的解決方案,

如果是NA與(滯後+鉛)/ 2如果仍然NA與替換替換如果仍然用NA代替鉛,則滯後。

library(dplyr) 
t(apply(df, 1, function(x){ 
    lagx = dplyr::lag(x) 
    leadx = dplyr::lead(x) 
    b = ifelse(is.na(x),(leadx+lagx)/2, x) 
    b = ifelse(is.na(b), leadx, b) 
    b = ifelse(is.na(b), lagx, b) 
    return(b) 
    } 
)) 
#output 
    t u v w x 
[1,] 1 1 2.0 2 2 
[2,] 1 3 3.0 3 3 
[3,] 2 4 4.0 4 4 
[4,] 4 6 5.5 5 5 
[5,] 4 4 3.0 2 6 
[6,] 3 2 2.0 3 3 
+0

這也適用!謝謝!! –

+0

@Hardik gupta該列只是四捨五入至小數點後一位,因爲一個推算值有一位小數,如果您在起始數據中只有'df [4,3] = 5.5',也會發生同樣的情況。 – missuse

0
t<-c(1,1,2,4,NA,3) 
u<-c(1,3,4,6,4,2) 
v<-c(2,3,4,NA,3,2) 
w<-c(2,3,4,5,2,3) 
x<-c(2,3,4,5,6,NA) 
df<-data.frame(t,u,v,w,x) 

df[which(is.na(t)), "t"] <- df[which(is.na(t)), "u"] 
df[which(is.na(x)), "x"] <- df[which(is.na(x)), "w"] 
df[which(is.na(v)), "v"] <- (df[which(is.na(v)), "u"] + df[which(is.na(v)), "w"])/2 

> df 
    t u v w x 
1 1 1 2.0 2 2 
2 1 3 3.0 3 3 
3 2 4 4.0 4 4 
4 4 6 5.5 5 5 
5 4 4 3.0 2 6 
6 3 2 2.0 3 3