【问题标题】:Using a loop to extract values of lists within lists in R使用循环在 R 中的列表中提取列表的值
【发布时间】:2021-08-15 04:01:51
【问题描述】:

我有一个列表 (chla_vals),其中包含两个湖泊的 12 个月度叶绿素值(总共 24 个 chla 值)。需要注意的是,当我使用length()检查这个列表的长度时,结果是12。正因为如此,我才相信这是一个列表的列表。

这里的一些乐于助人的人也有类似的情况,所以我修改了他们的代码,使用以下方法提取第一个湖的 chla 值:

chl_lake1 <- sapply(chla_vals, '[', 1)

虽然这很好用,但我有多个类似于 chla_vals 的列表,其中包含基于用于测量叶绿素-a 的方法略有不同的值,并且将来我会有更多的湖泊。因此,我正在尝试编写一个循环,它将为每个月和每个湖提取这些 chl-a 值并将它们输出到数据框中。

我认为最好的方法是将我的所有列表(例如:chla_valschla_vals1chla_vals2)合并到另一个列表中列表,然后循环遍历它。我是 R 的初学者,所以如果这不是最佳实践,请告知。

到目前为止我的代码:

#Reproducible examples of chla_vals, chla_vals2, and chla_vals3
chla_vals <- list(runif(2))
chla_vals <- rep(chla_vals, 12)

chla_vals2 <- list(runif(2))
chla_vals2 <- rep(chla_vals2, 12)

chla_vals3 <- list(runif(2))
chla_vals3 <- rep(chla_vals3, 12)

#Combining all lists into a larger list, and specifying the list names
chla_comb <- list(chla_vals = chla_vals, chla_vals2 = chla_vals2, chla_vals3 = chla_vals3)

#Storing the names of each list  
list_names <- names(chla_comb)

#Creating an empty dataframe to store my values, with 3 columns corresponding to my three original lists
#I know I will need more columns (eg: chlorophyll-a method, month, and lake ID), but I figure I can sort that later
values_df <- setNames(data.frame(matrix(ncol = length(list_names))), list_names)

#The actual loop:
for (i in seq_along(chla_comb)) {
     v <- chla_comb[i]
    values_df[i] <- lapply(v, '[', 1)
  }

这种方法有效,但对于每个 chl-a 方法(chla_vals chla_vals1chla_vals2)。我需要每种方法的所有 24 个值,因为我对叶绿素随时间的变化感兴趣

编辑:包括一个可重现的小例子。这是我可以创建的最好的,但列表看起来与我所拥有的不完全一样。我认为解决方案无论哪种方式都行得通。

【问题讨论】:

  • 请展示一个可重现的小例子进行测试

标签: r list loops for-loop lapply


【解决方案1】:

您可以使用c 将列表合并为一个,并使用do.call(rbind) 将其转换为2 列矩阵。

values_mat <- do.call(rbind, c(chla_vals, chla_vals2, chla_vals3))
values_mat

#           [,1]      [,2]
# [1,] 0.1264052 0.1575803
# [2,] 0.1264052 0.1575803
# [3,] 0.1264052 0.1575803
# [4,] 0.1264052 0.1575803
# [5,] 0.1264052 0.1575803
# [6,] 0.1264052 0.1575803
# [7,] 0.1264052 0.1575803
#...
#...

【讨论】:

  • 嗯我喜欢这个主意,但我丢失了列表名称(chla_vals、chla_vals2 等)。有没有办法保留这些标题,以便它们出现在第一列?谢谢!
  • @seak23 你可以使用purrr::map_df(chla_comb, ~as.data.frame(do.call(rbind, .)), .id = 'name')
猜你喜欢
  • 1970-01-01
  • 2020-08-15
  • 2018-02-15
  • 2021-12-05
  • 2018-07-07
  • 2012-10-04
  • 1970-01-01
  • 2021-10-04
  • 2015-10-02
相关资源
最近更新 更多