繁体   English   中英

R:在数据帧中:将列中的第一个非NA值设置为NA

[英]R: In dataframe: set first non-NA value in column to NA

我有一个大型数据帧,300多列(时间序列),大约2600个观测值。 列中填充了大量的NA,然后是短时间序列,然后通常再次使用NA。 我想在每列中找到第一个非NA值,并用NA替换它。

这是我希望实现的,只有更大的数据帧:

之前:

   x1 x2 x3 x4
1  NA NA NA NA
2  NA NA NA NA
3   1  1 NA NA
4   2  2  1  1
5   3  3  2  2
6   4  4  3  3
7   5  5  4  4
8   6  6  5  5
9   7  7  6  6
10  8  8  7  7
11  9  9 NA NA
12 10 10 NA NA
13 NA NA NA NA
14 NA NA NA NA

后:

   x1 x2 x3 x4
1  NA NA NA NA
2  NA NA NA NA
3  NA NA NA NA
4   2  2 NA NA
5   3  3  2  2
6   4  4  3  3
7   5  5  4  4
8   6  6  5  5
9   7  7  6  6
10  8  8  7  7
11  9  9 NA NA
12 10 10 NA NA
13 NA NA NA NA
14 NA NA NA NA

我已经四处搜索并找到了为每一列做到这一点的方法,但我将其应用于整个数据框的努力已经证明是困难的。

我创建了一个示例数据帧来重现我的原始数据帧:

#Dataframe with NA
x1=x2=c(NA,NA,1:10,NA,NA)
x3=x4=c(NA,NA,NA,1:7,NA,NA,NA,NA)
df=data.frame(x1,x2,x3,x4)

我已经使用这个替换1柱(由@Joshua乌尔里希设置有NA的第一值在这里 ),但是我想将它应用到所有列,而无需手动改变300+代码:

NonNAindex <- which(!is.na(df[,1]))
firstNonNA <- min(NonNAindex)
is.na(df[,1]) <- seq(firstNonNA, length.out=1)

我试图将上面的内容设置为一个函数,并使用apply / lapplyfor循环运行所有列,但还没有真正弄清楚如何将更改应用于我的数据帧。 我确信有些东西我完全被忽略了,因为我只是在R中迈出了我的第一个小步骤。

所有建议都将受到高度赞赏!

我们可以使用base R

df1[] <- lapply(df1, function(x) replace(x, which(!is.na(x))[1], NA))
df1
#   x1 x2 x3 x4
#1  NA NA NA NA
#2  NA NA NA NA
#3  NA NA NA NA
#4   2  2 NA NA
#5   3  3  2  2
#6   4  4  3  3
#7   5  5  4  4
#8   6  6  5  5
#9   7  7  6  6
#10  8  8  7  7
#11  9  9 NA NA
#12 10 10 NA NA
#13 NA NA NA NA
#14 NA NA NA NA

或者像@thelatemail建议的那样

df1[] <- lapply(df1, function(x) replace(x, Position(Negate(is.na), x), NA))

既然你想为所有列做到这一点,你可以使用mutate_all功能从dplyr 有关更多信息,请参见http://dplyr.tidyverse.org/ 特别是,您可能希望查看此处显示的一些示例。

library(dplyr)
mutate_all(df, funs(if_else(row_number() == min(which(!is.na(.))), NA_integer_, .)))
#>    x1 x2 x3 x4
#> 1  NA NA NA NA
#> 2  NA NA NA NA
#> 3  NA NA NA NA
#> 4   2  2 NA NA
#> 5   3  3  2  2
#> 6   4  4  3  3
#> 7   5  5  4  4
#> 8   6  6  5  5
#> 9   7  7  6  6
#> 10  8  8  7  7
#> 11  9  9 NA NA
#> 12 10 10 NA NA
#> 13 NA NA NA NA
#> 14 NA NA NA NA

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM