让我有这样的日期帧(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”?
我会很乐意提供任何帮助。非常感谢。
非常感谢@a Krün的。这是非常聪明的方式。 – oercim
最后一个问题,为什么新列的名称是“x”insted“y” – oercim
@oercim因为我们在数据集上应用了'na.locf',而不是在单个列上应用。它返回原始数据集。假设我们做了'转换(df2,y = na.locf(na.locf(x,na.rm = FALSE),fromLast = TRUE))' – akrun