根据条件验证R中两个数据框之间的列中的值
Posted
技术标签:
【中文标题】根据条件验证R中两个数据框之间的列中的值【英文标题】:Validating values in column between two data frames in R based on conditions 【发布时间】:2019-07-23 01:55:49 【问题描述】:我有两个数据框。我必须匹配nndf
和tndf
之间的前两列,如果匹配,我必须检查第三列中的值是否相同并更新第三个数据帧。问题是nndf
比tndf
长。
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"))
我想在第三个数据框中填充结果。此数据框从nndf
和tndf
的前两列中获取公共值,如果它们是公共的,则检查第三列1234.21
和3432.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 <- 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中另一个数据帧的列标题名称有条件地创建新列