[英]In a tibble, extract names from named lists by mutating a new list-column
我有一個帶有列表列的小標題。 其中之一(我們稱之為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
,則新的 list-column 將包含一個向量,其中包含嵌套在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(...)
。
我將不勝感激任何幫助!
像這樣按行執行計算:
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]>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.