R:在按日期匹配行后,用第二个 dfrm 中的值替换第一个 dfrm 中多列中的 NA 值

标签 r indexing na

这是我努力重建昨天出现的一个问题,我花了大部分时间解决这个问题,但再也找不到问题了。 2 个数据集 df1 和较小的 df2 具有相同的列名,并要求仅替换 date 行中的 NA 值。列匹配。我想合并可以做到,而且可能不那么繁重,但我正在寻找 match() -ing 和索引策略,最终找到了一个:

df1 <- structure(list(date = c(20040101L, 20040115L, 20040131L, 20040205L, 
20040228L, 20040301L, 20040315L, 20040331L), X11A = c(100L, 200L, 
NA, NA, NA, 150L, NA, NA), X11A.1 = c(150L, NA, 165L, NA, NA, 
155L, NA, NA), X21B = c(NA, 200L, 180L, NA, NA, 170L, 180L, NA
), X3CC = c(NA, NA, 190L, NA, NA, 150L, 190L, 175L), X3CC.1 = c(140L, 
NA, 190L, NA, NA, 160L, 200L, 180L)), .Names = c("date", "X11A", 
"X11A.1", "X21B", "X3CC", "X3CC.1"), class = "data.frame", row.names = c(NA, 
-8L))

df2 <- structure(list(date = c(20040228L, 20040131L, 20040331L), X11A = c(140L, 
170L, NA), X11A.1 = c(145L, NA, 145L), X21B = c(165L, NA, 160L
), X3CC = c(150L, NA, NA), X3CC.1 = c(155L, NA, NA)), .Names = c("date", 
"X11A", "X11A.1", "X21B", "X3CC", "X3CC.1"), class = "data.frame", row.names = c(NA, 
-3L))

实际提供的内容:

df1:
  date       11A    11A    21B    3CC    3CC
 20040101    100    150     NA     NA    140
 20040115    200     NA    200     NA     NA
 20040131     NA    165    180    190    190
 20040205     NA     NA     NA     NA     NA
 20040228     NA     NA     NA     NA     NA
 20040301    150    155    170    150    160
 20040315     NA      NA    180    190    200
 20040331     NA      NA     NA    175    180

df2:
 date        11A    11A    21B    3CC    3CC
 20040228    140    145    165    150    155
 20040131    170     NA     NA     NA     NA
 20040331     NA    145    160     NA     NA

最佳答案

is.na函数可以从数据帧参数创建逻辑的"template"。我的目标是创建这样一个模板,然后只选择带有 match 的行。两者之间的结果date列。使用 which arr.ind=TRUE 给出一个两列矩阵,可以用作 [<- 的单个参数或 [ :

valpos <- which(is.na(df1)[match(df2$date, df1$date), ], arr.ind=TRUE)

下一个任务是转换第一列(名为“行”),以便用正确的行替换“目标”数据框:
targpos <- cbind( match(df2$date, df1$date)[ valpos[,'row'] ] , 
                  valpos[,'col'])

那么它只是:
> df1[targpos] <- df2[valpos]
> 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

当我将订单改组到日期时,我确实使问题变得更加困难。我认为这个逻辑也很难解决这个问题。

关于R:在按日期匹配行后,用第二个 dfrm 中的值替换第一个 dfrm 中多列中的 NA 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37093727/

相关文章:

r - ggplot2:添加背景层

r - mean(,na.rm = TRUE)仍返回NA

r - 按组在第一个非 NA 值之前填充缺失值 (NA)

python - Pandas :为什么数字 float 的默认列类型是?

r - 在 R ggplot2 中为同一因子内的每个点显示不同的符号

r - 从 lmer 对象 (lme4, R) 中提取随机效应的原始模型矩阵

python - 将 2D 图像转换为 3D

algorithm - 填字游戏搜索的最佳数据结构

mongodb - 非 ACID RethinkDB 或 MongoDB 如何维护非相等查询的二级索引

database - 在 Access 2010 中创建具有引用完整性的关系时出现“索引过多”错误