2017-10-13 64 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