0

我有一个带有列表列的小标题。其中之一(我们称之为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 无效下标类型 'list'
i 输入names_ofmap_chr(...)

我将不胜感激任何帮助!

4

1 回答 1

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]>
于 2021-02-03T13:51:28.673 回答