使用R

时间:2017-05-29 16:03:04

标签: r

让我有一个列名为x的日期框架(df1):

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”,尽管我把它定义为“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”?

我会很高兴得到任何帮助。非常感谢。

1 个答案:

答案 0 :(得分: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(...