R 替换数据帧中从不同列开始的NA值
这是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
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)
是的,很抱歉你是对的-我有一个字符串作为第一列。您的代码现在可以工作了,因为我已经删除了有问题的列。