我想知道我做错了什么。
我尝试使用case_when()
和summarise()
来获得每个id
的摘要,具体取决于每个id
的行数。
library(dplyr, warn.conflicts = F)
mock <- tibble::tribble(~id, ~name, ~year,
1, "xy", 2022,
1, "xyz", 2021,
2, "aaa", NA,
3, "xaa", 2021)
mock %>%
group_by(id) %>%
summarise(
condition = case_when(
n() > 1 ~ "problem",
.default = NA_character_
),
name2 = case_when(
n() == 1 ~ name,
.default = NA_character_
)
)
#> Warning: Returning more (or less) than 1 row per `summarise()` group was deprecated in
#> dplyr 1.1.0.
#> ℹ Please use `reframe()` instead.
#> ℹ When switching from `summarise()` to `reframe()`, remember that `reframe()`
#> always returns an ungrouped data frame and adjust accordingly.
#> Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
#> generated.
#> `summarise()` has grouped output by 'id'. You can override using the `.groups`
#> argument.
#> # A tibble: 4 × 3
#> # Groups: id [3]
#> id condition name2
#> <dbl> <chr> <chr>
#> 1 1 problem <NA>
#> 2 1 problem <NA>
#> 3 2 <NA> aaa
#> 4 3 <NA> xaa
创建于2023-09-09带有reprex v2.0.2
但我只想有:
#> # A tibble: 3 × 3
#> id condition name2
#> <dbl> <chr> <chr>
#> 2 1 problem <NA>
#> 3 2 <NA> aaa
#> 4 3 <NA> xaa
3条答案
按热度按时间oo7oh9g91#
case_when
用于向下迭代一个列,并基于其他列中的现有值创建一个新的向量。这不是你想做的您正尝试根据组大小有条件地选择单个输出,组大小始终为长度为1的整数。实际上,n()
的值被回收到与组大小相同长度的向量中。如果希望summarize
的输出长度为1,则应使用if
和else
,而不是case_when
或if_else
。创建于2023-09-09带有reprex v2.0.2
zengzsys2#
你可以这样使用
case_when
:使用
first()
或[1]
将克服@Allan卡梅隆解释的问题wko9yo5t3#
试试这个