R 替换数据帧中从不同列开始的NA值

R 替换数据帧中从不同列开始的NA值,r,dataframe,fill,na,R,Dataframe,Fill,Na,这是NA主题的一个变体,我还没有找到答案。我每月都会按列进行观察,并按行进行大量的系列分析。有些缺失值为真值,但有些应为零。我想用零替换给定序列的缺失值,但仅在观察到该序列的值之后 例如,假设: Mth1 Mth2 Mth3 Mth4 1 1 2 1 3 2 NA 3 2 1 3 NA 2 1 NA 4 NA NA 2 NA 5 2 2 NA 2 我想将此更改为: Mth1 M

这是NA主题的一个变体,我还没有找到答案。我每月都会按列进行观察,并按行进行大量的系列分析。有些缺失值为真值,但有些应为零。我想用零替换给定序列的缺失值,但仅在观察到该序列的值之后

例如,假设:

   Mth1 Mth2 Mth3 Mth4
1    1    2    1    3
2    NA   3    2    1
3    NA   2    1   NA
4    NA   NA   2   NA
5    2    2    NA   2
我想将此更改为:

   Mth1 Mth2 Mth3 Mth4
1    1    2    1    3
2    NA   3    2    1
3    NA   2    1    0
4    NA   NA   2    0
5    2    2    0    2

我想要类似于
locf
函数的东西,它能够在第一个正观测值之前保留缺失值,但我想要用零填充,而不是使用最后一个观测值。

我们可以使用
apply
MARGIN=1
,找到第一个非NA元素的位置,获取从该元素到最后一个元素的序列,将行子集并将NA元素替换为0

df1[] <- t(apply(df1, 1,  function(x) {
        i1 <- which(!is.na(x))[1]:length(x)
        x[i1] <- replace(x[i1], is.na(x[i1]), 0)
        x}))
df1
#    Mth1 Mth2 Mth3 Mth4
#1    1    2    1    3
#2   NA    3    2    1
#3   NA    2    1    0
#4   NA   NA    2    0
#5    2    2    0    2
数据
df1我们可以使用
apply
MARGIN=1
,找到第一个非NA元素的位置,得到从该元素到最后一个元素的顺序,将行子集并将NA元素替换为0

df1[] <- t(apply(df1, 1,  function(x) {
        i1 <- which(!is.na(x))[1]:length(x)
        x[i1] <- replace(x[i1], is.na(x[i1]), 0)
        x}))
df1
#    Mth1 Mth2 Mth3 Mth4
#1    1    2    1    3
#2   NA    3    2    1
#3   NA    2    1    0
#4   NA   NA    2    0
#5    2    2    0    2
数据
df1这里是另一种使用矩阵索引的基本R方法:

df[is.na(df) & t(apply(!is.na(df), 1, cummax))] <- 0
df
  Mth1 Mth2 Mth3 Mth4
1    1    2    1    3
2   NA    3    2    1
3   NA    2    1    0
4   NA   NA    2    0
5    2    2    0    2

df[is.na(df)&t(apply(!is.na(df),1,cummax))下面是另一个使用矩阵索引的基本R方法:

df[is.na(df) & t(apply(!is.na(df), 1, cummax))] <- 0
df
  Mth1 Mth2 Mth3 Mth4
1    1    2    1    3
2   NA    3    2    1
3   NA    2    1    0
4   NA   NA    2    0
5    2    2    0    2

df[is.na(df)&t(apply(!is.na(df),1,cummax))]智能思考。智能思考。我不想质疑你的代码,但我的所有NAs都被零取代。@AndrewEaves这是基于你的示例。请检查
str(yourdata)
是的,很抱歉你是对的-我有一个字符串作为第一列。您的代码现在可以工作了,因为我已经删除了有问题的列。我不想质疑您的代码akrun,但我的所有NAs都被零替换。@AndrewEaves这是基于您的示例。请检查
str(yourdata)
是的,很抱歉你是对的-我有一个字符串作为第一列。您的代码现在可以工作了,因为我已经删除了有问题的列。