2017-05-29 134 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