如何使用for循环仅插入不在主数据帧内的行?
本质上,我试图使用for循环将示例df中某一列中的数据与主df相匹配 样本df:如何使用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中丢失了。我以前的代码只是用于循环
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您需要更新的解决方案中的代码吗