我知道有很多关于删除重复项的内容,但我的问题似乎不同。
我有一个类似于这个的
我希望筛选出所有
我有一个类似于这个的
data.frame
:library(dplyr)
#>
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#>
#> filter, lag
#> The following objects are masked from 'package:base':
#>
#> intersect, setdiff, setequal, union
x <- data.frame(id = c(1, 1, 1, 1, 2, 3, 3),
date = as.Date(c("2016-04-24", "2016-04-24", "2016-04-24",
"2016-04-24", "2016-04-24", "2016-04-28",
"2016-04-28")),
code = c("a", "b", "b", "a", "a", "a", "a"))
x
#> id date code
#> 1 1 2016-04-24 a
#> 2 1 2016-04-24 b
#> 3 1 2016-04-24 b
#> 4 1 2016-04-24 a
#> 5 2 2016-04-24 a
#> 6 3 2016-04-28 a
#> 7 3 2016-04-28 a
我希望筛选出所有
code
为"a"但不是"b"的重复项。预期输出如下所示:x[c(1:3, 5:6), ]
#> id date code
#> 1 1 2016-04-24 a
#> 2 1 2016-04-24 b
#> 3 1 2016-04-24 b
#> 5 2 2016-04-24 a
#> 6 3 2016-04-28 a
我之前提出了一个类似的问题,链接在这里:Ignore value conditionally within group_by in dplyr。我基于这个问题尝试了一些解决方法,但它们都没有成功,这让我很烦恼。
x %>% group_by(id, date) %>%
filter(!(code == "a" & duplicated(code) == "a"))
#> # A tibble: 7 x 3
#> # Groups: id, date [3]
#> id date code
#> <dbl> <date> <fct>
#> 1 1. 2016-04-24 a
#> 2 1. 2016-04-24 b
#> 3 1. 2016-04-24 b
#> 4 1. 2016-04-24 a
#> 5 2. 2016-04-24 a
#> 6 3. 2016-04-28 a
#> 7 3. 2016-04-28 a
x %>% group_by(id, date) %>%
filter(!(duplicated(code) == "a" & "a" %in% code))
#> # A tibble: 7 x 3
#> # Groups: id, date [3]
#> id date code
#> <dbl> <date> <fct>
#> 1 1. 2016-04-24 a
#> 2 1. 2016-04-24 b
#> 3 1. 2016-04-24 b
#> 4 1. 2016-04-24 a
#> 5 2. 2016-04-24 a
#> 6 3. 2016-04-28 a
#> 7 3. 2016-04-28 a
这段文字是关于 IT 技术的,创建日期为 2018 年 8 月 17 日,使用了 reprex package(版本为 v0.2.0)。
我猜问题出在 duplicated()
函数调用上,它没有返回 TRUE
或者 FALSE
,但我不确定。
'a'
但是不能用"a"
?当我使用x %>% group_by(id, date) %>% filter(!duplicated(code == "a") | code != "a")
它会忽略所有的b
代码。 - Frederickfilter(!duplicated(code == "a")
和filter(!duplicated(code)
看起来是一样的。因此,在duplicated()
中指定== "a"
似乎是多余的。为什么? - Frederickv1 <- c('a', 'a', 'b', 'c', 'b'); !duplicated(v1 == 'a'); !duplicated(v1)
。 - akrun