【问题标题】:In a tibble, extract names from named lists by mutating a new list-column在 tibble 中,通过改变新的列表列从命名列表中提取名称
【发布时间】:2021-02-03 13:42:37
【问题描述】:

我有一个带有列表列的小标题。其中之一(我们称之为info 列)包含命名列表。对于 tibble 的每一行,我想改变一个新的列表列,它将包含一个向量(嵌套)。该向量的元素将对应于相邻“info”列表列中命名列表的名称

示例

my_tibble <-
  structure(
  list(
    var_name = c("artworks", "sports","independence", "gender"),
    info = list(
      list(
        `Vincent van Gogh` = "The Starry Night",
        `Leonardo da Vinci` = "Mona Lisa",
        `Johannes Vermeer` = "Girl with a Pearl Earring",
        `Sandro Botticelli` = "The Birth of Venus",
        `Grant Wood` = "American Gothic"
      ),
      NULL,
      list(
        `1776` = "USA",
        `1818` = "Argentina",
        `1956` = "Morocco"
      ),
      list(male = "XY chromosomes",
           female = "XX chromosomes")
    )
  ),
  row.names = c(NA, -4L),
  class = c("tbl_df", "tbl", "data.frame")
)

> my_tibble
## # A tibble: 4 x 2
##   var_name     info            
##   <chr>        <list>          
## 1 artworks     <named list [5]>
## 2 sports       <NULL>          
## 3 independence <named list [3]>
## 4 gender       <named list [2]>

期望的输出

var_name       info               names_of        
<chr>          <list>             <list>           
1 artworks     <named list [5]>   <chr [5]>     # c("Vincent van Gogh", "Leonardo da Vinci", "Johannes Vermeer", "Sandro Botticelli", "Grant Wood")
2 sports       <NULL>             <chr [1]>     # c("seems_null") 
3 independence <named list [3]>   <dbl [3]>     # c(1776, 1818, 1956)       
4 gender       <named list [2]>   <chr [2]>     # c("male", "female")

我的尝试

我想改变一个新的列表列,它检查info 列。如果info 不是NULL,则新的列表列将包含一个向量,其中列表的名称 嵌套在info 中;否则,将字符串 "seems_null" 放入变异列表列中。

library(dplyr)
library(purrr)

my_tibble %>%
  mutate(names_of = map_chr(info, ~ ifelse(is.null(.x), "seems_null", names(.x))))

## # A tibble: 4 x 3
##   var_name     info             names_of        
##   <chr>        <list>           <chr>           
## 1 artworks     <named list [5]> Vincent van Gogh
## 2 sports       <NULL>           seems_null      
## 3 independence <named list [3]> 1776            
## 4 gender       <named list [2]> male  

很遗憾,这只会返回info 列表中的第一个名字。

我也尝试过使用pmap(),如this answer所示,但没有成功:

my_list %>%
  mutate(names_of = map_chr(info, ~ ifelse(is.null(.x), list("seems_null"), pmap(.x, names(.x)[c(...)])  ) ))

错误:mutate() 输入 names_of 有问题。
x 无效下标 输入“列表”
i 输入names_ofmap_chr(...)

我将不胜感激!

【问题讨论】:

    标签: r dplyr purrr tibble


    【解决方案1】:

    像这样逐行执行计算:

    res <- my_tibble %>%
       rowwise %>%
       mutate(names_of = list(if (is.null(info)) "seems_null" else names(info))) %>%
       ungroup
    

    给予:

    > res
    # A tibble: 4 x 3
      var_name     info             names_of 
      <chr>        <list>           <list>   
    1 artworks     <named list [5]> <chr [5]>
    2 sports       <NULL>           <chr [1]>
    3 independence <named list [3]> <chr [3]>
    4 gender       <named list [2]> <chr [2]>
    

    【讨论】:

    • 啊!那很整齐。并不是说它太重要了,但是您是否看到了一种“自然地”让names_of 成为dbl 向量而不是第3 行中的chr 的方法?
    • 在答案中,将 names(info) 替换为 type.convert(names(info))
    猜你喜欢
    • 1970-01-01
    • 2021-02-21
    • 1970-01-01
    • 2021-06-09
    • 2012-02-21
    • 1970-01-01
    • 1970-01-01
    • 2020-01-27
    相关资源
    最近更新 更多