如何解决使用 tidyverse 以整洁的格式映射列
我经常使用如下所示的模式,其中我使用列表列将数据存储在 tibble
中,使用 purrr::map
将函数应用于数据,然后使用 pivot_longer
进行转换整理格式(长)。
是否有一种更简洁/更惯用的方法可以一步完成此操作,而不必每次都对数据进行透视?
library(tidyverse)
df <- tibble(n = 5:10)
df$data <- map(df$n,~rnorm(.x))
df$mean <- map_dbl(df$data,~mean(.x))
df$median <- map_dbl(df$data,~median(.x))
# A tibble: 6 x 4
n data mean median
<int> <list> <dbl> <dbl>
1 5 <dbl [5]> -0.0239 -0.324
2 6 <dbl [6]> -0.396 0.0153
3 7 <dbl [7]> 0.506 0.711
4 8 <dbl [8]> 0.463 0.537
5 9 <dbl [9]> -0.248 -0.555
6 10 <dbl [10]> -0.153 -0.293
df <- pivot_longer(df,mean:median)
# A tibble: 12 x 4
n data name value
<int> <list> <chr> <dbl>
1 5 <dbl [5]> mean -0.386
2 5 <dbl [5]> median -0.407
3 6 <dbl [6]> mean -0.190
4 6 <dbl [6]> median -0.451
5 7 <dbl [7]> mean -0.456
6 7 <dbl [7]> median -0.0801
7 8 <dbl [8]> mean -0.0408
8 8 <dbl [8]> median 0.0577
9 9 <dbl [9]> mean 0.273
10 9 <dbl [9]> median 0.410
11 10 <dbl [10]> mean -0.720
12 10 <dbl [10]> median -1.01
解决方法
我认为您已经有了一个很好的方法,我会通过将所有函数链接到一个管道 (%>%
) 来使用相同的方法。
如果您想避免 pivot_longer
步骤,您可以按每一行分组并为每一行创建两个新行。这适用于 dplyr
1.0.0 或更高版本。
library(tidyverse)
df %>%
mutate(data = map(n,rnorm),group = row_number()) %>%
group_by(group) %>%
summarise(n = n,data = data,value = {tmp <- unlist(data);c(median(tmp),mean(tmp))},name = c('median','mean')) %>%
ungroup %>%
select(-group)
# n data value name
# <int> <list> <dbl> <chr>
# 1 5 <dbl [5]> 0.571 median
# 2 5 <dbl [5]> 0.343 mean
# 3 6 <dbl [6]> 0.220 median
# 4 6 <dbl [6]> 0.0419 mean
# 5 7 <dbl [7]> -0.193 median
# 6 7 <dbl [7]> -0.132 mean
# 7 8 <dbl [8]> -0.171 median
# 8 8 <dbl [8]> 0.00583 mean
# 9 9 <dbl [9]> 0.952 median
#10 9 <dbl [9]> 0.471 mean
#11 10 <dbl [10]> 0.684 median
#12 10 <dbl [10]> 0.250 mean
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。