简短的版本,我希望能够在从summarise()
函数返回的“列表列”上set_names()
。因此,如果我有一个使用range()
函数的列表列,我希望能够将名称设置为“min”和“max”。
下面是详细信息和可重复的示例。
library(tidyverse)
# Consider the following:
msleep %>%
group_by(vore) %>%
summarise(
sleep_total_range = list(range(sleep_total))
)
#> # A tibble: 5 x 2
#> vore sleep_total_range
#> <chr> <list>
#> 1 carni <dbl [2]>
#> 2 herbi <dbl [2]>
#> 3 insecti <dbl [2]>
#> 4 omni <dbl [2]>
#> 5 <NA> <dbl [2]>
# I would like to be able to identify and label (i.e., set_names()) for the
# min and max columns
# Fail 1: No Column, No Labels
msleep %>%
group_by(vore) %>%
summarise(
sleep_total_range = list(range(sleep_total))
) %>%
unnest()
#> # A tibble: 10 x 2
#> vore sleep_total_range
#> <chr> <dbl>
#> 1 carni 2.7
#> 2 carni 19.4
#> 3 herbi 1.9
#> 4 herbi 16.6
#> 5 insecti 8.4
#> 6 insecti 19.9
#> 7 omni 8
#> 8 omni 18
#> 9 <NA> 5.4
#> 10 <NA> 13.7
# Fail 2: Column, but labels are not correct
msleep %>%
group_by(vore) %>%
summarise(
sleep_total_range = list(range(sleep_total) %>% enframe(name = "range_col"))
) %>%
unnest()
#> # A tibble: 10 x 3
#> vore range_col value
#> <chr> <int> <dbl>
#> 1 carni 1 2.7
#> 2 carni 2 19.4
#> 3 herbi 1 1.9
#> 4 herbi 2 16.6
#> 5 insecti 1 8.4
#> 6 insecti 2 19.9
#> 7 omni 1 8
#> 8 omni 2 18
#> 9 <NA> 1 5.4
#> 10 <NA> 2 13.7
预期结果
# Success: This is my desired result/output, but it feels verbose,
# and not very "tidyverse / purrr"
msleep %>%
group_by(vore) %>%
summarise(
sleep_total_range = list(range(sleep_total) %>% enframe(name = "range_col"))
) %>%
unnest() %>%
mutate(
range_col = ifelse(range_col == 1, "min", "max")
)
#> # A tibble: 10 x 3
#> vore range_col value
#> <chr> <chr> <dbl>
#> 1 carni min 2.7
#> 2 carni max 19.4
#> 3 herbi min 1.9
#> 4 herbi max 16.6
#> 5 insecti min 8.4
#> 6 insecti max 19.9
#> 7 omni min 8
#> 8 omni max 18
#> 9 <NA> min 5.4
#> 10 <NA> max 13.7
接近了,但还没有...
# I thought I was close with this
temp <-
msleep %>%
group_by(vore) %>%
summarise(
sleep_total_range = list(range(sleep_total))
)
temp$sleep_total_range[[1]] %>% set_names(c("min", "max")) %>% enframe()
#> # A tibble: 2 x 2
#> name value
#> <chr> <dbl>
#> 1 min 2.7
#> 2 max 19.4
# But this obviously does not work...
msleep %>%
group_by(vore) %>%
summarise(
sleep_total_range = list(range(sleep_total)) %>%
set_names(c("min", "max")) %>%
enframe()
)
#> `nm` must be `NULL` or a character vector the same length as `x`
创建于2019-07-18由reprex package(v0.3.0)
5条答案
按热度按时间uqzxnwby1#
如果我们创建一个
tibble
,我们可以得到两列packageVersion('dplyr')# [1] ‘0.8.99.9000’
测试了代码ruyhziif2#
最简单的选择是
group_by
vore
,然后计算每组的min
和max
。但是,如果您想继续使用
range
,一个选择是unnest
,并对每个vore
重复c("min", "max")
。yhxst69z3#
或者在取消嵌套之前添加第二个列表:
voj3qocg4#
虽然在这种情况下,改变
c("min","max")
是更好的选择,但如果你想避免这种情况,你可以这样做:dgtucam15#
受@akrun的启发,您还可以在这里采用一种有点非传统的双重去嵌套方法: