我经常想在"single step"中执行 tidyr::spread
和 dplyr::summarise
来按组聚合数据 . 我想要的是 expected
. 我可以通过单独执行 summarise
和 spread
来获得 expected
并将结果与 dplyr::full_join
结合起来,但我正在寻找 alternative approaches that avoid full_join . 不需要真正的单步骤方法 .
df <- data.frame(
id = rep(letters[1], 2),
val1 = c(10, 20),
val2 = c(100, 200),
key = c("A", "B"),
value = c(1, 2))
library(tidyverse)
result1 <- df %>%
group_by(id) %>%
summarise(
val1 = min(val1),
val2 = max(val2)
)
# A tibble: 1 x 3
# id val1 val2
# <fctr> <dbl> <dbl>
# 1 a 10.0 200
result2 <- df %>%
select(id, key, value) %>%
group_by(id) %>%
spread(key, value)
# A tibble: 1 x 3
# Groups: id [1]
# id A B
# * <fctr> <dbl> <dbl>
# 1 a 1.00 2.00
expected <- full_join(result1, result2, by="id")
# A tibble: 1 x 5
# id val1 val2 A B
# <fctr> <dbl> <dbl> <dbl> <dbl>
# 1 a 10.0 200 1.00 2.00
3 回答
我怀疑你的数据可能有更多的边缘情况需要进行一些修改,但为什么不简单
spread
然后summarise
?您可以为每个变量单独指定汇总函数,因此对于A
和B
,您假设没有't actually need to calculate anything (I')您可以删除所有NA
:自我回答:这是一种适用于
tidyr::nest
的方法,但似乎"messy"并没有好多少使用
do
的另一种方法: