gpt4 book ai didi

r - 访问 R 中的嵌套列表

转载 作者:行者123 更新时间:2023-12-05 00:17:51 25 4
gpt4 key购买 nike

我为一些数据创建了一个双嵌套结构。我如何访问第二级(或就此而言是第 n 级?)的数据

library(gapminder)
library(purrr)
library(tidyr)
gapminder
nest_data <- gapminder %>% group_by(continent) %>% nest(.key = by_continent)

nest_2<-nest_data %>% mutate(by_continent = map(by_continent, ~.x %>% group_by(country) %>% nest(.key = by_country)))

我现在如何将中国的数据从 nest_2 获取到数据框或 tibble 中?

我可以得到整个亚洲的数据,但我无法孤立中国。
a<-nest_2[nest_2$continent=="Asia",]$by_continent  ##Any better way of isolating Asia from nest_2?

我以为我可以做到
b<-a[a$country=="China",]$by_country 

但我收到以下错误
Error in a[a$country == "China", ] : incorrect number of dimensions 



> glimpse(a)
List of 1
$ :Classes ‘tbl_df’, ‘tbl’ and 'data.frame': 33 obs. of 2 variables:
..$ country : Factor w/ 142 levels "Afghanistan",..: 1 8 9 19 25 56 59 60 61 62 ...
..$ by_country:List of 33

所以我的大错误是没有认识到产品是一个列表,这可以通过在最后添加 [[1]] 来补救。但是,我非常喜欢@Floo0 的解决方案。我冒昧地提供了一个函数,该函数采用变量的名称,以防列序列与所提供的列序列不同。
select_unnest <- function(df, listcol, var, var_val){  ###listcol, var and var_val must enclosed by ""
df[[listcol]][df[[var]]==var_val][[1]]
}

nest_2 %>% select_unnest(listcol = "by_continent", var = "continent", var_val = "Asia") %>%
select_unnest(listcol = "by_country", var = "country", var_val = "China")

最佳答案

这是一种可通过管道(%>%)使用的基本 R 方法

select_unnest <- function(x, select_val){
x[[2]][x[[1]]==select_val][[1]]
}

nest_2 %>% select_unnest("Asia") %>% select_unnest("China")

时序对比:
Unit: microseconds

min lq mean median uq max neval
aosmith1 3202.105 3354.0055 4045.9602 3612.126 4179.9610 17119.495 100
aosmith2 5797.744 6191.9380 7327.6619 6716.445 7662.6415 24245.779 100
Floo0 227.169 303.3280 414.3779 346.135 400.6735 4804.500 100
Ben Bolker 622.267 720.6015 852.9727 775.172 875.5985 1942.495 100

代码:
microbenchmark::microbenchmark(
{a<-nest_2[nest_2$continent=="Asia",]$by_continent
flatten_df(a) %>%
filter(country == "China") %>%
unnest},
{nest_2 %>%
filter(continent == "Asia") %>%
select(by_continent) %>%
unnest%>%
filter(country == "China") %>%
unnest},
{nest_2 %>% select_unnest("Asia") %>% select_unnest("China")},
{n1 <- nest_2$by_continent[nest_2$continent=="Asia"][[1]]
n2 <- n1 %>% filter(country=="China")
n2$by_country[[1]]}
)

关于r - 访问 R 中的嵌套列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39291360/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com