用变化的索引填充数据帧的行/在循环中更新索引

时间:2019-12-02 01:00:44

标签: r list loops dataframe

在此先要道歉,因为这将难以描述并且难以通过示例进行再现,在此先感谢您通读!

我试图使用可返回单个值或多个值的自定义函数有条件地填充空数据框。每个值必须是数据框中的一行。多个值来自以下事实:将嵌套列表传递给该函数,其中一些仅包含1个列表,其中一些具有9个或10个子列表。

通常,带有索引的简单for循环可以做到:

for (i in 1:nrow(df)){
    df[i,] <- function(x[i])
}

但是因为我的函数可以返回多个值,每个值必须是一行,所以索引一直在变化,因此我不知道如何更新它。基本上我一直在尝试的是:

for (i in 1:nrow(df)){    # where df is the empty df I want to fill
df[i,] <- if(another.corresponding.df == 1){function(x[i])    # if there is only 1 nested list at index i, apply the function and write the returned value to the corresponding row
  } else {
       for (j in 1:another.corresponding.df[i]){   # if there are multiple nested lists at index i, loop through j nested lists
          if(j == 1) {df[i,] <- function(x[i][j])  # use index 1 as the row
           } else { df[i+1,] <- function(x[i][j])  # update the row number based on however many j nested lists produced values
      }
  }
}

^这一直有效,直到遇到 first 多值索引,之后抛出原始索引,并且我收到以下信息: Error in x[[jj]][iseq] <- vjj : replacement has length zero

例如,假设我使用列表x构造数据框,其中x是3个子列表的列表:x [1]具有1个值,x [2]具有2个值,x [3]具有1个值:

x <- list(2:7, list(12:15, 15:17), 10:14)

x
[[1]]
[1] 2 3 4 5 6 7

[[2]]
[[2]][[1]]
[1] 12 13 14 15

[[2]][[2]]
[1] 15 16 17

[[3]]
[1] 10 11 12 13 14

我想将函数应用于此列表的 all 个元素,以填充数据框,使其总共有 4 行,其中

row 1 = function(x[1])
row 2 = function(x[2][1]) 
row 3 = function(x[2][2])
row 4 = function(x[3])

因此,一旦我在上面的代码中应用了df[i+1,]部分,第3行就填充了x [2] [2]的值,因此我无法使用i = 3来获得x [3]。

我需要根据遇到的嵌套列表的多少来迭代更新索引值-我该怎么做?

1 个答案:

答案 0 :(得分:1)

假设要应用于每个列表的函数为fun1,而我们拥有的列表称为lst1,我们可以尝试这样的操作

apply_fun <- function(x) {
   if (is.list(x)) 
     do.call(rbind, lapply(x, fun1))
   else fun1(x)
}

do.call(rbind, lapply(lst1, apply_fun))

apply_fun检查它是否为嵌套列表,并将fun1应用于嵌套列表的每个元素。