【发布时间】: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_of是map_chr(...)。
我将不胜感激!
【问题讨论】: