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

标签 r tidyr purrr

我经常使用如下所示的模式,其中我使用列表列将数据存储在 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/

相关文章:

r - 如何有选择地将列转换为 data.frame 中的行?

r - Tidyr 的 gather() 与 NAs

r - tidyr 嵌套表上的 mutate_each 给出 "Unknown inputs"

r - 如何创建包含嵌套 xts 对象 - 雅虎数据的列?

r - R 中两个相同变量的交叉表 - 以对角线反射(reflect)

javascript - 在 Shiny.onInputChange 上下载文件

r - 使用ggrepel覆盖水平定位

r - 如何在 tidyverse 中将缺失的数据行添加为 NA

r - 如何组合包含 NA 的一个 data.frame 中的列以删除 NA

r - 将函数映射到两个嵌套对象