如何使用for循环仅插入不在主数据帧内的行?

如何使用for循环仅插入不在主数据帧内的行?,r,R,本质上,我试图使用for循环将示例df中某一列中的数据与主df相匹配 样本df: ID Fruit F1 Apple F2 Orange F3 Banana 主df: ID Fruit F1 Apple F3 Banana F4 Pear F5 Mangoes F6 Grapes F7 Watermelon 正如你们在这里看到的,F2橙色实际上在我的主df中丢失了。我以前的代码只是用于循环

本质上,我试图使用for循环将示例df中某一列中的数据与主df相匹配

样本df:

ID   Fruit
F1   Apple
F2   Orange
F3   Banana 
主df:

    ID   Fruit
    F1   Apple
    F3   Banana 
    F4   Pear
    F5   Mangoes
    F6   Grapes
    F7   Watermelon
正如你们在这里看到的,F2橙色实际上在我的主df中丢失了。我以前的代码只是用于循环,以检查样本df中的任何内容是否与主df匹配,当检测到Apple时,主df将简单地停止,而不是填充F2橙色

for(i in 1:nrow(sample)) {
if (sample[i,1] %in% main$ID) {
stop("Fruits are already in dataframe!")} else {
rbind(sample,main)
  }
}

因此,我需要for循环做的是将F2 Orange插入主df,同时保持其他df不变。

如果
main_df
中的所有值都是唯一的,则可以
rbind
sample_df
并获取
unique

unique(rbind(main_df, sample_df))

#  ID      Fruit
#1 F1      Apple
#2 F3     Banana
#3 F4       Pear
#4 F5    Mangoes
#5 F6     Grapes
#6 F7 Watermelon
#8 F2     Orange
使用
dplyr

library(dplyr)
bind_rows(main_df, sample_df) %>% distinct()

如果我们想检查
sample_df
中存在于
main_df
中的所有值并通知用户,我们可以使用:

if(all(do.call(paste, sample_df) %in% do.call(paste, main_df))) 
    stop("Fruits are already in dataframe!")
else 
    unique(rbind(sample_df, main_df))

我们可以使用
anti_join
查找不在另一行中的行,然后将该输出与原始数据绑定

library(dplyr)
anti_join(sample_df, main_df) %>%
     bind_rows(main_df, .)

谢谢你的回复。然而,我想保留for循环&stop消息来通知用户,如果示例中的所有内容都与主df匹配,则结果已经在主df中。有没有办法保留它?@user1464667请参见答案中的更新。需要什么帮助吗?在您当前的循环中,您正在停止第一行中的循环,这意味着如果第一行与循环匹配,则循环将停止,我认为这不是您想要的。@user1464667您想在所有水果都签入
sample
后通知用户吗?或者您想为每一行执行此操作。所以,如果第一行是present打印“水果存在”,如果不是print打印“水果不存在”?嗨,Ronak,你的第二条评论是我想要的,我发现你的代码很有用,尽管不是我提出的最终解决方案。谢谢。感谢Akrun提出的解决方案。然而,我试图保留for循环,因为在else函数之后封装了更多的代码。如果有新条目,则在绑定示例中新绑定的行后也要运行它们。如果没有,代码将停止。@user1464667您需要更新的解决方案中的代码吗