【问题标题】:How to calculate length of vector within a list column (nested)如何计算列表列中向量的长度(嵌套)
【发布时间】:2018-04-05 06:17:37
【问题描述】:

我有以下代码

library(tidyverse)
dat <- iris %>% 
    group_by(Species) %>% 
    summarise(summary = list(fivenum(Petal.Width))) 

dat
#> # A tibble: 3 x 2
#>   Species    summary  
#>   <fct>      <list>   
#> 1 setosa     <dbl [5]>
#> 2 versicolor <dbl [5]>
#> 3 virginica  <dbl [5]>

基本上我使用 Iris 数据,按物种分组,然后计算 fivenum()

我想要做的是简单地计算汇总值的长度: 这是我尝试过的,但没有产生我期望的结果:

dat %>% 
  mutate(nof_value = length(summary))

# A tibble: 3 x 3
#  Species    summary   nof_values
#  <fct>      <list>         <int>
#1 setosa     <dbl [5]>          3
#2 versicolor <dbl [5]>          3
#3 virginica  <dbl [5]>          3

nof_values 应该都等于 5。正确的做法是什么?

【问题讨论】:

  • length(summary) 为您提供summary 列表列的length。像dat %&gt;% mutate(unlist(lapply(summary, length))) 这样的东西会起作用(虽然不是很优雅)

标签: r dplyr tidyverse


【解决方案1】:

我们可以使用lengths来计算嵌套列表的长度

library(tidyverse)
dat %>%
   mutate(nof_values = lengths(summary))

#  Species    summary   nof_values
#  <fct>      <list>         <int>
#1 setosa     <dbl [5]>          5
#2 versicolor <dbl [5]>          5
#3 virginica  <dbl [5]>          5

在基数 R 中的等价物是

dat$nof_values <- lengths(dat$summary)

旁注:lengthlengths 不同

length(dat$summary)
#[1] 3

lengths(dat$summary)
#[1] 5 5 5

【讨论】:

  • 谢谢!这是正确的答案。 R 有时可能是一种糟糕的语言(沮丧)
【解决方案2】:

您可以使用 purrr 包中的 map_int 命令(它是 tidyverse 的一部分)

dat <- iris %>% 
  group_by(Species) %>% 
  summarise(summary = list(fivenum(Petal.Width))) %>% 
  mutate(nof_value = map_int(summary, length))

【讨论】:

    猜你喜欢
    • 2020-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多