在tidyverse中映射数据框的列

4
我通常使用以下模式,其中我使用列表列在 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 
1个回答

5

我认为你已经有了一个很好的方法,我会使用相同的方式将所有函数链接在一个管道 (%>%)中。

如果你想避免 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  

谢谢!你能解释一下这行代码吗:value = {tmp <- unlist(data);c(median(tmp), mean(tmp))} - max
data 是一个列表,meanmedian 适用于向量值。比较 mean(list(1:5))mean(unlist(list(1:5))) 的输出结果。为了避免两次 unlist,我将其存储在临时变量 tmp 中,并在 medianmean 中使用它。 - Ronak Shah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接