我必须处理像这样的递归列表中的一些数据(下面是简化的可复制示例):
groups
#> $group1
#> $group1$countries
#> [1] "USA" "JPN"
#>
#>
#> $group2
#> $group2$countries
#> [1] "AUS" "GBR"
数据输入代码如下:
chars <- c("USA", "JPN")
chars2 <- c("AUS", "GBR")
group1 <- list(countries = chars)
group2 <- list(countries = chars2)
groups <- list(group1 = group1, group2 = group2)
groups
我正在尝试找出如何提取列表中的向量,而无需手动为每个组编写一行代码。下面的代码可以工作,但是我的示例中有很多组(并且组的数量会发生变化),因此,弄清楚如何以更有效的方式提取所有向量将是很棒的。这是行之有效的方式:
countries1 <- groups$group1$countries
countries2 <- groups$group2$countries
在该示例中,我尝试提取的最低级别向量始终称为countries
,但它们包含在更改名称中的列表(仅通过编号而变化)。
是否有一个简单的purrr解决方案?还是tidyverse解决方案?还是其他解决方案?
在列表中添加其他案例
groups[["group3"]] <- list()
groups[["group4"]] <- list(foo = letters[1:2])
groups[["group5"]] <- list(foo = letters[1:2], countries = LETTERS[1:2])
这是一个将任何列表仅映射到名为“ countries”的元素的函数。NULL
如果没有元素则返回
fun = function(x)
x[["countries"]]
映射原始列表以仅包含您感兴趣的元素
interesting <- Map(fun, groups)
然后使用的组合变换这些成data.frameunlist()
和rep()
df <- data.frame(
country = unlist(interesting, use.names = FALSE),
name = rep(names(interesting), lengths(interesting))
)
或者,使用整洁的语法,例如
interesting %>%
tibble(group = names(.), value = .) %>%
unnest("value")
输出是
# A tibble: 6 x 2
group value
<chr> <chr>
1 group1 USA
2 group1 JPN
3 group2 AUS
4 group2 GBR
5 group5 A
6 group5 B
如果在解析的各个元素时还有其他问题groups
,请修改fun
,例如,
fun = function(x)
as.character(x[["countries"]])
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句