【问题标题】:Appending/Growing List Elements Separately in r在 r 中分别追加/增长列表元素
【发布时间】:2020-11-11 01:20:36
【问题描述】:

我有一个内嵌函数的循环,它每次都会创建一个具有相同元素但长度不同的列表。我希望创建的元素列表在每个循环中增长或合并。这是一个非常简化的可视化:

# Code Body-------------------------------------------------------------
desiredList <- list()


for (i in 1:3){
  
  # "existingList" has three dataframes of A, B embedded 
  # A is a dataframe with x1 and x2 columns
  # B is a vector
  # A, B values are calculated using "somefunction" &
  # in each loop their lenght differ
  existingList <- somefunction(variable[i])
  
  # "desiredList" should also have three dataframes of A, B 
  # In each loop, gererated Ai, Bi append to A, B elements of "desiredList"
  desiredList <- append(desiredList, (existingList))
}

# existingList in each loop--------------------------------------------
# i=1................................                                           
A:'data.frame': 3 obs. of 2 variables:                                          
  ..$ x1: num [1:3] 1   2   3                           
  ..$ x2: num [1:3] 13  26  39                          
B:'data.frame': 1 obs. of 1 variables:                                          
  ..$ b: num [1:1]  2.6                                 

# i=2................................                                           
A:'data.frame': 2 obs. of 2 variables:                                          
  ..$ x1: num [1:2] 4   5                               
  ..$ x2: num [1:2] 52  65                              
B:'data.frame': 3 obs. of 1 variables:                                          
  ..$ b: num [1:3]  5.2 7.8 10.4                            

# i=3................................                                           
A:'data.frame': 5 obs. of 2 variables:                                          
  ..$ x1: num [1:5] 6   7   8   9   10                  
  ..$ x2: num [1:5] 78  91  104 117 130                 
B:'data.frame': 2 obs. of 1 variables:                                          
  ..$ b: num [1:2]  13  15.6                

# desiredList at the end of the loop
A:'data.frame': 10 obs. of 2 variables:                                         
  ..$ x1: num [1:10]    1   2   3   4   5   6   7   8   9   10
  ..$ x2: num [1:10]    13  26  39  52  65  78  91  104 117 130
B:'data.frame': 6 obs. of 1 variables:                                          
  ..$ b: num [1:6]  2.6 5.2 7.8 10.4    13  15.6            

我已经尝试过“append”、“lapply”、“Map”和许多其他功能。但是,没有人给出正确的答案。

【问题讨论】:

  • 你能somefunction吗?

标签: r list for-loop append


【解决方案1】:

您想要的输出需要“行绑定”数据帧,如下所示:

  
library(tibble)

a1 <- tribble(
~A1, ~B1,   ~C1,
  1, 13 ,  2.6,
  2, 26 ,  5.2,
  3, 39 ,  7.8,
  7, 91 ,  18.2,
  8, 104,  20.8
  )

a2 <- tribble(
~A2, ~B2,~C2,     
4, 52, 10.4,   
5, 65, 13,     
6, 78, 15.6
)

a3 <- tribble(
~A3, ~B3, ~C3,
9, 117, 23.4,
10, 130, 26
)

out <- lapply(
  X = list(a1, a2, a3), 
  FUN =  function(x) `names<-`(x, substr(names(x), 1,1))
  )

do.call("rbind", out)
#> # A tibble: 10 x 3
#>        A     B     C
#>    <dbl> <dbl> <dbl>
#>  1     1    13   2.6
#>  2     2    26   5.2
#>  3     3    39   7.8
#>  4     7    91  18.2
#>  5     8   104  20.8
#>  6     4    52  10.4
#>  7     5    65  13  
#>  8     6    78  15.6
#>  9     9   117  23.4
#> 10    10   130  26

dplyr::bind_rows(out)
#> # A tibble: 10 x 3
#>        A     B     C
#>    <dbl> <dbl> <dbl>
#>  1     1    13   2.6
#>  2     2    26   5.2
#>  3     3    39   7.8
#>  4     7    91  18.2
#>  5     8   104  20.8
#>  6     4    52  10.4
#>  7     5    65  13  
#>  8     6    78  15.6
#>  9     9   117  23.4
#> 10    10   130  26

reprex package (v0.3.0) 于 2020 年 7 月 21 日创建

如果您可以控制数据框名称并且可以避免向它们附加数字,则可以更轻松地对它们进行行绑定。 dplyr::bind_rows() 也是一种简单的绑定方式。

【讨论】:

    【解决方案2】:

    解决此问题的一种方法是使用“地图”功能。 Map 的唯一问题是它无法将空列表与包含元素的列表合并。这可以通过应用 if-else 语句来解决。当循环第一次运行时,空列表设置为现有列表,对于剩余的循环,应用“映射”函数来更新所需的列表。

    # Code Body-------------------------------------------------------------
    desiredList <- list()
    
    
    for (i in 1:3){
      
      # "existingList" generated using an external function
      existingList <- somefunction(variable[i])
      
      # "desiredList" generation 
      if (i == 1){ # define the list in first loop
        desiredList <- existingList
      } else {     # append the list 
        desiredList <- Map(rbind, desiredList, existingList)
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-25
      • 1970-01-01
      相关资源
      最近更新 更多