[英]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
/ lapply
和for
循环运行所有列,但还没有真正弄清楚如何将更改应用于我的数据帧。 我确信有些东西我完全被忽略了,因为我只是在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.