【问题标题】:How do you calculate the mean / sum of particular columns of a nested list column using purr's map function如何使用 purr 的 map 函数计算嵌套列表列的特定列的平均值/总和
【发布时间】:2020-02-03 15:57:26
【问题描述】:

我正在尝试使用 purr 来总结嵌套列表列的特定列。

library(tidyverse)
z <- tibble(name = c("Bill","Bill","Bill","Sue","Sue"), grade =c(90L,95L,70L,100L,98L), time=c(10L,11L,10L,15L,16L))

summary <- z %>% 
  group_by(name) %>% 
  nest %>% 
  mutate(n = map_int(data,nrow)) %>% 
  mutate(avg = map(data$grade,mean)) %>% 
  mutate(ttl_time = map(data$time, sum))

当我运行这个我得到一个错误:: Column y must be length 3 (the number of rows) or one, not 2

我的目标输出是:

name      data     n      avg      ttl_time

Bill     [3x3]     3      92        31

Sue      [2x3]     2      99        31  

当我删除最后两个 mutate 函数时,脚本会按预期工作。这让我相信我没有在数据列中隔离成绩和时间列,但我可以弄清楚我做错了什么?

我观看了这个 r studio 视频,我相信我正在做我在视频中看到的同样的事情。 Working with List Columns

【问题讨论】:

    标签: r tidyverse purrr


    【解决方案1】:
    z %>% 
      group_by(name) %>% 
      nest() %>% 
      mutate(n = map_int(data, nrow),
             avg = map_dbl(data, ~ mean(.x$grade)),
             ttl_time = map_dbl(data, ~ sum(.x$time)))
    
    # # A tibble: 2 x 5
    #   name  data                 n   avg ttl_time
    #   <chr> <list>           <int> <dbl>    <dbl>
    # 1 Bill  <tibble [3 × 2]>     3    85       31
    # 2 Sue   <tibble [2 × 2]>     2    99       31
    

    ~ 的公式表示法是例如function(.x) mean(.x$grade)


    OP 的错误确实源于map 不能直接遍历data 列表的每个grade 元素,至少不能使用这种语法。

    data$grade 被理解为列表data 中名为grade 的元素,并且没有这样的元素。

    这种替代语法可能有助于理解这是如何实现的:

    z %>% 
      group_by(name) %>% 
      nest() %>% 
      mutate(n = map_int(data, nrow),
             avg = map_dbl(map(data, "grade"), mean),
             ttl_time = map_dbl(map(data, "time"), sum))
    

    其中map(data, "grade") 从列表列data 的元素中提取每个grade 组件。

    虽然在我看来,这比第一个建议可读性差。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-24
      • 1970-01-01
      • 1970-01-01
      • 2011-09-04
      • 2020-08-02
      • 1970-01-01
      • 1970-01-01
      • 2017-06-11
      相关资源
      最近更新 更多