Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 修改:用数据帧中相同的行名替换行的值_R - Fatal编程技术网

R 修改:用数据帧中相同的行名替换行的值

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

我有一个数据框,它有几行相同的行名。我想用与前一行相同的非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        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