检查一个数据框的值是否存在于另一个数据框

时间:2020-02-11 14:06:16

标签: r for-loop match

我是R语言的初学者,想知道它如何用于每一行。

例如

我有两个数据帧。

我想看看其他数据框中是否存在行。 我想循环ab $ Fruits中的每一行,并检查每个名称是否在另一个数据框bc [E1:E3]列中。

    ab<-data.frame(Fruits = c("Apple","Banana"),Units = c("3","2"))

    bc<-data.frame("E1"=c("Apple","Grapes","Watermelon","Na"),
                   "E2"=c("Grapes","Berries","Custard","Guava"),
                   "E3"=c("Apple","Banana","Grapes","Na"))

例如

循环开始时,ab $ fruits的第一行与bc的每一列匹配,如果第一行(Apple)与bc $ E1匹配,则在ab $ new列中结果应返回1并循环中断。再次进入第二行(香蕉)搜索bc中的每一列,如果与bc $ E1列中的任何列都不匹配,则在ab $ new列中的结果应返回0。

再次循环迭代。

当ab $ fruits(apple)循环从第1行(苹果)到达并与bc $ E3列匹配,而第2行(香蕉)与Banana匹配时,两行的结果都应为ab $ new = 1。

如果两个行的ab $ new == 1且两个单位的总和> = 5,则在ab $ view =“ Bill”中创建新列 输出ab:

**SN Fruits     Number New** view
1  Apple       3        1    Bill
2  Banana      2        1    Bill  

我尝试了%in%,但没有发生。

需要建议。

1 个答案:

答案 0 :(得分:1)

您可以使用unlist和可选的unique并使用%in%检查是否有水果

ab$New <- +(ab$Fruits %in% unique(unlist(bc[-1])))
if(all(ab$New == 1) && sum(as.numeric(as.character(ab$Units))) >= 5) ab$view <- "Bill"
ab
#  Fruits Units New view
#1  Apple     3   1 Bill
#2 Banana     2   1 Bill