您可以使用
dplyr
来实现这一点。我设置了
stringsAsFactors = FALSE
,以消除有关因子不匹配的警告。
library(dplyr)
a1 <- data.frame(A = c(1:5, 2, 4, 2), B = letters[c(1:5, 2, 4, 2)], stringsAsFactors = FALSE)
a2 <- data.frame(A = c(1:3,2), B = letters[c(1:3,2)], stringsAsFactors = FALSE)
a1_tmp <-
a1 %>%
group_by(A, B) %>%
mutate(tmp_id = row_number()) %>%
ungroup()
a2_tmp <-
a2 %>%
group_by(A, B) %>%
summarise(count = n()) %>%
ungroup()
left_join(a1_tmp, a2_tmp, by = c('A', 'B')) %>%
ungroup() %>% filter(is.na(count) | tmp_id > count) %>%
select(-tmp_id, -count)
编辑
这里有一个更短的类似解决方案。它做了以下几件事:(1)添加一列行号以连接两个data.frame
项目;(2)在a2
(第二个data.frame
)中添加一个临时列,该列将在与a1
的连接中显示为空(即表示它是唯一的a1
)。
library(dplyr)
left_join(a1 %>% group_by(A,B) %>% mutate(rn = row_number()) %>% ungroup(),
a2 %>% group_by(A,B) %>% mutate(rn = row_number(), tmpcol = 0) %>% ungroup(),
by = c('A', 'B', 'rn')) %>%
filter(is.na(tmpcol)) %>%
select(-tmpcol, -rn)
我认为这个解决方案比第一个简单一些(也许是非常少)。
2b
在a1
中出现了两次,因此只有一个被取消,另一个保留在输出中。 - Ronak Shah