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

per*_*f2k 4 r dataframe 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
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的第一步时,我已经完全忽略了某些事情。

所有建议将不胜感激!

akr*_*run 5

我们可以用 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)