已修改:替换数据框中具有相同rownames的行的值

时间:2016-05-06 23:02:54

标签: r

我的数据框中有几行相同的行名。我想用相同的前一行的非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]   }

请在这方面指导我。

由于 萨巴

2 个答案:

答案 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。