R 修改:用数据帧中相同的行名替换行的值
我有一个数据框,它有几行相同的行名。我想用与前一行相同的非NA替换第二行的NAs。但如果第二行中已经存在一个值,则不应影响该值 请参阅下文: df: 我希望生成的数据帧为: df_新:R 修改:用数据帧中相同的行名替换行的值,r,R,我有一个数据框,它有几行相同的行名。我想用与前一行相同的非NA替换第二行的NAs。但如果第二行中已经存在一个值,则不应影响该值 请参阅下文: df: 我希望生成的数据帧为: df_新: 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
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循环,但结果并不理想:
对于(第2部分中的i:nrow(df)){
out[i,]这里有一个使用
data.table
的选项。我们将数据集放在列表中,然后使用rbindlist
将其作为单个data.table,按“日期”分组,循环通过列(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提到的使用进行循环和哪个,另一个带有数据的选项。表将这两个选项与设置一起使用
setDT(df1)
dfN <- setDT(df2)[df1, on = "date"]
for(j in 2:ncol(df1)){
set(df1, i = which(is.na(df1[[j]])), j = j,
value = dfN[[j]][is.na(df1[[j]])])
}
df1
# 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
setDT(df1)
dfN使用数据的替代解决方案。表
:
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。我应该包括什么使其格式更好?使用dput()
将数据样本粘贴到问题中。例如,要提供十行df1,请粘贴到dput(df1[1:10,])的输出中
。这将便于人们将数据复制和粘贴到他们的R控制台。@ZheyuanLi:严格来说,df1的所有NAs都有df2的非NA。在大多数情况下,df1和df2都有相同行的NAs。但我只想替换那些df1的NAs,它们有df2的并行非NAs可用。是这样吗红色表示就行名称而言,df1
和df2
没有重复?@KunalPuri:df2中的所有行都与df1中的行名称相同。
setDT(df1)
dfN <- setDT(df2)[df1, on = "date"]
for(j in 2:ncol(df1)){
set(df1, i = which(is.na(df1[[j]])), j = j,
value = dfN[[j]][is.na(df1[[j]])])
}
df1
# 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
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