如何从R中的嵌套列表中提取元素
How to extract elements from nested list in R
我正在处理 json 数据,我已将这些数据转换为带有一些列表列的 tibble。我正在尝试从列表列中提取有用的信息,但遇到了问题。如果给定以下数据集-
mydf <-tibble(
x = c(1, 2, 3),
y = list(list(list(id="id1", title="title1"), list(id="id11", title="title11")),
list(id="id2",title="title2"),
NULL)
)
如何转换成下面的-
data.frame(x=c(1:3), id = c("id1;id11", "id2", ""), title = c("title1;title11", "title2", ""))
# x id title
#1 1 id1;id11 title1;title11
#2 2 id2 title2
#3 3
感谢任何帮助。谢谢!
我认为有更好的方法,但这是我现在能做的。对于每一行,我提取字符串并将它们与 toString()
连接起来。由于 unnest()
为每一行创建多行(即 x 中的 1、2 和 3),我使用 summarize()
临时组合字符串。然后,我使用 separate()
.
将它们分开
mydf %>%
unnest(y, keep_empty = TRUE) %>%
rowwise %>%
mutate(y = toString(unlist(y))) %>%
group_by(x) %>%
summarize(string = paste(y, collapse = "_")) %>%
separate(col = string, into = c("id", "title"), sep = "_")
# x id title
# <dbl> <chr> <chr>
#1 1 id1, title1 id11, title11
#2 2 id2 title2
#3 3 "" NA
如果名称与示例中一致,您可以这样做:
mydf2 <- unlist(mydf)
x <- mydf2[grepl("x", names(mydf2))]
id <- mydf2[grepl("id", names(mydf2))]
title <- mydf2[grepl("title", names(mydf2))]
tibble(x, id, title)
# A tibble: 3 x 3
x id title
<chr> <chr> <chr>
1 1 id1 title1
2 2 id11 title11
3 3 id2 title2
我正在处理 json 数据,我已将这些数据转换为带有一些列表列的 tibble。我正在尝试从列表列中提取有用的信息,但遇到了问题。如果给定以下数据集-
mydf <-tibble(
x = c(1, 2, 3),
y = list(list(list(id="id1", title="title1"), list(id="id11", title="title11")),
list(id="id2",title="title2"),
NULL)
)
如何转换成下面的-
data.frame(x=c(1:3), id = c("id1;id11", "id2", ""), title = c("title1;title11", "title2", ""))
# x id title
#1 1 id1;id11 title1;title11
#2 2 id2 title2
#3 3
感谢任何帮助。谢谢!
我认为有更好的方法,但这是我现在能做的。对于每一行,我提取字符串并将它们与 toString()
连接起来。由于 unnest()
为每一行创建多行(即 x 中的 1、2 和 3),我使用 summarize()
临时组合字符串。然后,我使用 separate()
.
mydf %>%
unnest(y, keep_empty = TRUE) %>%
rowwise %>%
mutate(y = toString(unlist(y))) %>%
group_by(x) %>%
summarize(string = paste(y, collapse = "_")) %>%
separate(col = string, into = c("id", "title"), sep = "_")
# x id title
# <dbl> <chr> <chr>
#1 1 id1, title1 id11, title11
#2 2 id2 title2
#3 3 "" NA
如果名称与示例中一致,您可以这样做:
mydf2 <- unlist(mydf)
x <- mydf2[grepl("x", names(mydf2))]
id <- mydf2[grepl("id", names(mydf2))]
title <- mydf2[grepl("title", names(mydf2))]
tibble(x, id, title)
# A tibble: 3 x 3
x id title
<chr> <chr> <chr>
1 1 id1 title1
2 2 id11 title11
3 3 id2 title2