根据条件验证R中两个数据框之间的列中的值

Posted

技术标签:

【中文标题】根据条件验证R中两个数据框之间的列中的值【英文标题】:Validating values in column between two data frames in R based on conditions 【发布时间】:2019-07-23 01:55:49 【问题描述】:

我有两个数据框。我必须匹配nndftndf 之间的前两列,如果匹配,我必须检查第三列中的值是否相同并更新第三个数据帧。问题是nndftndf 长。

nndf <- data.frame("var1" = c("ABC","ABC","DEF", "FED","DGS"), "var2" = c("xyz","abc","def","dsf","dsf"), "var3" = c(1234.21,3432.12,0.12,1232.44,873.00))

tndf <- data.frame("var1" = c("ABC","ABC","DEF"), "var2" = c("xyz","abc","def"), "var3" = c(1234.21,3432.12,0.11))

ndf <- data.frame("var1" = c("ABC","ABC"), "var2" = c("xyz","abc"))

我想在第三个数据框中填充结果。此数据框从nndftndf 的前两列中获取公共值,如果它们是公共的,则检查第三列1234.213432.12,如果值相同,则返回 TRUE 并填充列。所需的输出是

var1   var2    var3
ABC    xyz     TRUE (indicating 1234.21 and 1234.21 in first two df are same)
ABC    abc     TRUE
DEF    def     FALSE (indicating 0.12 is not equal to 0.11)

我尝试使用forloop + if condition。但是,它会多次遍历每一行并填充结果。

【问题讨论】:

试试tndf$var3 &lt;- do.call(paste, tndf) %in% do.call(paste, nndf) 【参考方案1】:

我们可以做一个inner_join,然后比较两列中的值

library(dplyr)

inner_join(nndf, tndf, by = c("var1", "var2")) %>%
   mutate(var3 = var3.x == var3.y) %>%
   dplyr::select(var1, var2, var3)


#  var1 var2  var3
#1  ABC  xyz  TRUE
#2  ABC  abc  TRUE
#3  DEF  def FALSE

或者类似地在基础R中

df1 <- merge(nndf, tndf, by = c("var1", "var2"))
df1$var3 <- df1$var3.x == df1$var3.y

【讨论】:

【参考方案2】:

我们可以在base R中使用%in%来创建逻辑向量

tndf$var3 <- do.call(paste, tndf) %in% do.call(paste, nndf)
tndf
#  var1 var2  var3
#1  ABC  xyz  TRUE
#2  ABC  abc  TRUE
#3  DEF  def FALSE

或者使用连接

library(data.table)
setDT(tndf)[nndf, var3n := var3 == i.var3, on = .(var1, var2)]
tndf[, .(var1, var2, var3 = var3n)]
#   var1 var2  var3
#1:  ABC  xyz  TRUE
#2:  ABC  abc  TRUE
#3:  DEF  def FALSE

【讨论】:

@akrun....谢谢...我使用了第一个选项,因为我在第 3 列之外还有很多向量....已经创建了您的方法的改编版。

以上是关于根据条件验证R中两个数据框之间的列中的值的主要内容,如果未能解决你的问题,请参考以下文章

如何根据一个数据帧中的列值和R中另一个数据帧的列标题名称有条件地创建新列

Oracle SQL:根据在另一个表中给定条件的列中找到的值插入

R中的条件数据框突变与magrittr和dplyr

根据其他列中的条件更新一列中的值

R:dplyr 有条件地汇总并重新编码列中的值

R数据框复制不同空列中的值