如何解决如何在嵌套列表中使用 for 循环?
这是一个三层嵌套列表的例子(带有虚拟数字):
mylist <- list("A" = list("A1" = list("1","2","3"),"A2" = list("10","20","30")),"B" = list("B1" = list("11","22","33"),"B2" = list("110","220","330")))
我想将每个子列表(在较低级别)的最后一个元素提取到一个数据帧中,以便更轻松地处理数据并进行进一步的计算。 输出看起来像这样:
> mylist
First_level Second_level Last_value
> A A1 3
> A A2 30
> B B1 33
> B B2 330
这是接收输出的潜在数据帧结构。
df <- data.frame(First_level = character(),Second_level = character(),Last_value = integer())
我试过 for 循环:
for (i in length(mylist)){
for (j in length(mylist[[i]])){
df$last_element <- tail(mylist[[i]][[j]],1)
}
}
df
但是我必须对嵌套列表太无知才能正确编写双 for 循环来实现此目的... 你能帮忙吗?
解决方法
我们可以将 rrapply
与 melt
一起使用
library(rrapply)
library(dplyr)
rrapply(mylist,how = 'melt') %>%
group_by(First_level = L1,Second_level = L2) %>%
summarise(Last_value = last(value),.groups = 'drop')
# A tibble: 4 x 3
# Groups: First_level [2]
# First_level Second_level Last_value
# <chr> <chr> <chr>
#1 A A1 3
#2 A A2 30
#3 B B1 33
#4 B B2 330
在 OP 的循环中,它循环遍历单个值,即 length
而不是 1:length
或 seq_along
out <- list()
for(i in seq_along(mylist)) {
for(j in seq_along(mylist[[i]])) {
out <- c(out,tail(mylist[[i]][[j]],1))
}
}
,
使用 tidyverse
包:
library(tidyverse)
map(mylist,~map(.x,tail,1)) %>%
unlist() %>%
as.list() %>%
as_tibble() %>%
pivot_longer(cols = everything()) %>%
separate(col = "name",sep = "\\.",into = c("first_level","second_level"))
# A tibble: 4 x 3
first_level second_level value
<chr> <chr> <chr>
1 A A1 3
2 A A2 30
3 B B1 33
4 B B2 330
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。