你可以使用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)
## Make temp variables to join on then delete later.
# Create a row number
a1_tmp <-
a1 %>%
group_by(A, B) %>%
mutate(tmp_id = row_number()) %>%
ungroup()
# Create a count
a2_tmp <-
a2 %>%
group_by(A, B) %>%
summarise(count = n()) %>%
ungroup()
## Keep all that have no entry int a2 or the id > the count (i.e. used up a2 entries).
left_join(a1_tmp, a2_tmp, by = c('A', 'B')) %>%
ungroup() %>% filter(is.na(count) | tmp_id > count) %>%
select(-tmp_id, -count)
## # A tibble: 4 x 2
## A B
## <dbl> <chr>
## 1 4 d
## 2 5 e
## 3 4 d
## 4 2 b
EDIT
这里是一个类似的解决方案,短一点。这将做到以下几点:(1)添加一个行号的列来加入data.frame
两个项目(2)a2
(第2个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)
## # A tibble: 4 x 2
## A B
## <dbl> <chr>
## 1 4 d
## 2 5 e
## 3 4 d
## 4 2 b
我觉得这个解决方案比第一个更简单一点(也许很少)。
目前还不清楚你的输出是否正确,'2b'是在两个开始,我是否错过了什么? – steveb
@steveb'2b'在'a1'中是两次,所以只有一个被取消,一个留在输出中。 –
啊,这就是我读得太快。 – steveb