R中类似SAS In数据集选项的实现:筛选仅单数据框存在的数据
IN= Merge Logic in R Hey there! Since you're familiar with using SAS's IN= flags to filter rows that only exist in one dataset after merging, let's walk through exactly how to do this in R—both with base R tools and the tidyverse (dplyr) which might make it more straightforward.
Base R Approach (Matching Your SAS Syntax)
Your SAS code uses IN=in2 to keep only rows that are in have1 but not have2. In base R's merge() function, we can use the indicator argument to replicate this behavior:
Get rows only in have1 (equivalent to your SAS code)
# Merge with indicator to track where each row comes from merged <- merge(have1, have2, by = "Date", all.x = TRUE, sort = TRUE, indicator = TRUE) # Filter rows that only exist in the left dataset (have1) only_have1 <- merged[merged$"_merge" == "left_only", ] # Optional: Remove the merge indicator column only_have1$"_merge" <- NULL
Get rows only in have2 (reverse of your SAS logic)
To get the reverse—rows only in have2—we just switch to all.y = TRUE and filter for "right_only":
merged_reverse <- merge(have1, have2, by = "Date", all.y = TRUE, sort = TRUE, indicator = TRUE) only_have2 <- merged_reverse[merged_reverse$"_merge" == "right_only", ] only_have2$"_merge" <- NULL
Tidyverse (dplyr) Approach
If you prefer a more concise syntax, dplyr's anti_join() is made exactly for this scenario—it returns all rows from the first dataset that don't have a matching key in the second dataset.
First, load the package if you haven't already:
library(dplyr)
Get rows only in have1
only_have1 <- anti_join(have1, have2, by = "Date")
Get rows only in have2
Just reverse the order of the datasets in anti_join():
only_have2 <- anti_join(have2, have1, by = "Date")
Why Might setdiff() Not Have Worked?
setdiff() compares entire rows, not just the Date column. So if you have other columns in have1 and have2, even if two rows share the same Date, if other values differ, setdiff() would still keep that row. anti_join() is better here because it only checks the specified key (Date) to determine matches, which aligns with your SAS logic.
内容的提问来源于stack exchange,提问作者regents

