我有一个大型的数据框,包含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
Run Code Online (Sandbox Code Playgroud)
后:
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
Run Code Online (Sandbox Code Playgroud)
我四处搜寻并找到了针对每一列执行此操作的方法,但事实证明,我很难将其应用于整个数据框。
我创建了一个示例数据框来重现原始数据框:
#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)
Run Code Online (Sandbox Code Playgroud)
我用它用第1列中的NA替换了第一个值(由@Joshua Ulrich 在此处提供),但是我想将其应用于所有列,而无需手动更改300多个代码:
NonNAindex <- which(!is.na(df[,1]))
firstNonNA <- min(NonNAindex)
is.na(df[,1]) <- seq(firstNonNA, length.out=1)
Run Code Online (Sandbox Code Playgroud)
我试图将以上内容设置为函数,并使用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
Run Code Online (Sandbox Code Playgroud)
或如@thelatemail建议
df1[] <- lapply(df1, function(x) replace(x, Position(Negate(is.na), x), NA))
Run Code Online (Sandbox Code Playgroud)