我的数据框中有几行相同的行名。我想用相同的前一行的非NA替换每第二行的NA。但是如果第二行中已经存在一个值,则不应该受到影响。
请参阅以下内容:
DF:
date 1 1 2 3 3
20040101 100 150 NA NA 140
20040115 200 NA 200 NA NA
20040131 170 NA NA NA NA
20040131 NA 165 180 190 190
20040205 NA NA NA NA NA
20040228 140 145 165 150 155
20040228 NA NA NA NA NA
20040301 150 155 170 150 160
20040315 NA NA 180 190 200
20040331 NA 145 160 NA NA
20040331 NA NA NA 175 180
我希望结果数据框为:
df_new:
date 1 1 2 3 3
20040101 100 150 NA NA 140
20040115 200 NA 200 NA NA
20040131 170 165 180 190 190
20040205 NA NA NA NA NA
20040228 140 145 165 150 155
20040301 150 155 170 150 160
20040315 NA NA 180 190 200
20040331 NA 145 160 175 180
我尝试了以下for循环,但结果并不理想:
for(i in 2:nrow(df)){
if(all(is.na(df[i, ]))){ df[i, ] = fill[(i-1), ]}
out [i,]< - df [i-1,ncol] }
请在这方面指导我。
由于 萨巴
答案 0 :(得分:2)
以下是使用data.table
的选项。我们将数据集放在list
中,然后使用rbindlist
将其设为单个data.table,按'date'分组,循环遍历列(lapply(.SD, ..
)并将非NA的子集元件。
library(data.table)
unique(rbindlist(list(df1, df2))[,lapply(.SD, function(x)
if(all(is.na(x))) x else x[!is.na(x)]) , date])
# date X11A X11A.1 X21B X3CC X3CC.1
#1: 20040101 100 150 NA NA 140
#2: 20040115 200 NA 200 NA NA
#3: 20040131 170 165 180 190 190
#4: 20040205 NA NA NA NA NA
#5: 20040228 140 145 165 150 155
#6: 20040301 150 155 170 150 160
#7: 20040315 NA NA 180 190 200
#8: 20040331 NA 145 160 175 180
由于OP注意到使用for
循环和which
,因此使用data.table
的{{1}}的另一个选项将
set
答案 1 :(得分:0)
使用data.table
的替代解决方案:
library(data.table)
setDT(df)
df[,lapply(.SD,mean,na.rm=T),by=date]
## date X11A X11A.1 X21B X3CC X3CC.1
##1: 20040101 100 150 NaN NaN 140
##2: 20040115 200 NaN 200 NaN NaN
##3: 20040131 170 165 180 190 190
##4: 20040205 NaN NaN NaN NaN NaN
##5: 20040228 140 145 165 150 155
##6: 20040301 150 155 170 150 160
##7: 20040315 NaN NaN 180 190 200
##8: 20040331 NaN 145 160 175 180
假设:在这里,我假设如果单个日期出现多个元组,则每列只有一个唯一值,否则为NA。