【发布时间】:2021-11-01 20:26:51
【问题描述】:
我有两个 data.frames,每个都有数千行和数十列,它们都是通过合并几个 csv 文件创建的。 data.frames 正是我想要的。我还要补充一点,df1 和 df2 有几个共同的列。唯一的问题是其中一个,比如说 df1 ,对于某些列,有一些 NA(这是预期的/正常的)。好消息是我有 NA 的相同列也出现在第二个 data.frame 中,比如 df2,但没有 NA。我想做的是用 df1 的同一列中的值填充 df2 给定列中的 NA,其中每个值是根据 df1 和 df2 之间其他列值的匹配来选择的。
使用一些随机数据:
A<- format(seq(as.Date("2021/09/01"), by = "day", length.out = 26), format="%Y%m%d")
B<- format(seq(as.POSIXct("2021-1-1 15:00"), as.POSIXct("2021-1-02 16:00"), by = "hour"), format = "%H:%M")
C<- sample(1:100, 26, replace=FALSE)
D<- LETTERS
E<- paste(D, C)
df1<- cbind(A, B, C, D)
df2<- cbind(A, B, C, E)
df2[c(7:10, 13, 18:21), 3] <- NA #replace some of the values with NAs
df2<- df2[-c(2,5,11,17,23,26),] #delete some columns so df1 and df2 are of different size
我希望对于 df2$C,当找到 NA 值时,对应的 df2$A 和 df2$B 值都与所有 df1$A 和 df2$B 匹配。当且仅当在 df1 中找到匹配 df1$A 和 df1$B 的行时,将 df1$C 的相应值复制到 df2$C NA 值中。换句话说,对于上面的示例数据,如果 df2$C 中有一个 NA 值,则该特定行的日期和时间的相应组合应该与来自 df1 的所有结果串联的日期和时间相匹配,并且当匹配找到后,用df1$C对应的值代替df2$C中的NA。
# as an instance, a case of my df2 where a NA occurs is
df2[17,3]
#This should be replaced with the value from
df1[21,3]
# because the time and date of
df2[17,]
A B C E
"20210921" "11:00" NA "U 46"
#is the same than
df1[21,]
A B C D
"20210921" "11:00" "46" "U"
我 100% 确定每个 data.frame 中的 A 列和 B 列的串联会在每个 data.frame 中给出唯一的结果,因此 df1$A 和 df1$B 的串联将是唯一的,同样适用到df2。此外,可以肯定的是,df2$A 和 df2$B 的串联将产生一个且唯一的值,该值与 df1 中列 A 和 B 的串联相匹配。出于这个原因,我尝试将每个 data.frames 列 A 和 B 连接到一个新列中,以在 Base R 的 elseif 循环中使用 match(paste(...,...)) 查找匹配值,或者使用其他论坛中提出的 dplyr 库的其他解决方案,但我找不到适合我的解决方案。我认为这类似于具有多个条件的 Excel 查找/vlookup 函数,但我无法在 R 中弄清楚这一点。
关于如何进行的任何建议?谢谢。
【问题讨论】:
-
首先,您缺少“A”的代码。第二件事,如果您将所需的输出作为代码发布,那么帮助您会容易得多。换句话说,向我们展示您想要的输出应该是什么样子。
-
我已经编辑了问题和代码。