在我的数据帧中,我有两列感兴趣的列:id
和 name
- 我的目标是只保留id
的记录,其中id
name
有多个值, name
中的最终值是"B"。
示例数据如下所示:
> test
id name
1 1 A
2 2 A
3 3 A
4 4 A
5 5 A
6 6 A
7 7 A
8 2 B
9 1 B
10 2 A
输出将如下所示:
> output
id name
1 1 A
9 1 B
如何过滤以在 R 中获取这些行? 我知道您可以使用 %in%
运算符按具有多个变量的变量进行过滤,但不确定如何添加"B"必须是最后一条记录的条件。 我不反对使用像dplyr
这样的包,但 base R 中的解决方案将是理想的。 有什么建议吗?
下面是示例数据:
> dput(test)
structure(list(id = c(1, 2, 3, 4, 5, 6, 7, 2, 1, 2), name = c("A",
"A", "A", "A", "A", "A", "A", "B", "B", "A")), .Names = c("id",
"name"), row.names = c(NA, -10L), class = "data.frame")
使用 dplyr
,
test %>%
group_by(id) %>%
filter(n_distinct(name) > 1 & last(name) == 'B')
#Source: local data frame [2 x 2]
#Groups: id [1]
# A tibble: 2 x 2
# id name
# <dbl> <chr>
#1 1 A
#2 1 B
在data.table
:
library(data.table)
setDT(test)[, .SD[length(unique(name)) >= 2 & name[.N] == "B"],by = .(id)]
# id name
#1: 1 A
#2: 1 B