gpt4 book ai didi

r - 使用 tidyverse 以整洁的格式映射列

转载 作者:行者123 更新时间:2023-12-04 02:28:29 24 4
gpt4 key购买 nike

我经常使用如下所示的模式,其中我使用列表列将数据存储在 tibble 中,使用 purrr::map 将函数应用于数据,并且然后使用pivot_longer 转换为整齐的格式(long)。

是否有一种更简洁/更惯用的方式一步完成,而无需每次都转换数据?

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

关于r - 使用 tidyverse 以整洁的格式映射列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65715550/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com