我试图在一次操作中(或者至少尽可能简洁地)将函数的向量输出(即长度大于1)分配给多个列。
以range()
函数为例,它返回一个长度为2的数值向量,分别表示最小值和最大值,假设我想计算每组的range()
,并将输出分配给min
和max
两列。
我目前的方法是结合summarize
,然后手动添加一个键,然后重新调整为宽格式:
library(magrittr)
# create data
df <- dplyr::tibble(group = rep(letters[1:3], each = 3),
x = rpois(9, 10))
df
#> # A tibble: 9 x 2
#> group x
#> <chr> <int>
#> 1 a 8
#> 2 a 12
#> 3 a 8
#> 4 b 9
#> 5 b 14
#> 6 b 9
#> 7 c 11
#> 8 c 6
#> 9 c 12
# summarize gives two lines per group
range_df <- df %>%
dplyr::group_by(group) %>%
dplyr::summarize(range = range(x)) %>%
dplyr::ungroup()
range_df
#> # A tibble: 6 x 2
#> group range
#> <chr> <int>
#> 1 a 8
#> 2 a 12
#> 3 b 9
#> 4 b 14
#> 5 c 6
#> 6 c 12
# add key and reshape
range_df %>%
dplyr::mutate(key = rep(c("min", "max"), 3)) %>%
tidyr::pivot_wider(names_from = key, values_from = range)
#> # A tibble: 3 x 3
#> group min max
#> <chr> <int> <int>
#> 1 a 8 12
#> 2 b 9 14
#> 3 c 6 12
有没有更优雅/简洁的替代方案?
- 编辑:**
理想情况下,替代解决方案可以处理任意数量的输出(例如,如果函数返回长度为3的输出,则应创建3个变量)。
3条答案
按热度按时间8ftvxx2r1#
如果您使用的是旧版本的dplyr
bvpmtnay2#
函数
呼叫g:
py49o6xq3#
基于onyambu的回答,我为此构建了一个小型的泛型函数,可能在某些极端情况下,这个函数不起作用。
不带任何附加参数的示例:
输出:
带有附加参数的示例:
输出: