rbinding 与包含 R 中 NA 的空列表的列表

rbinding with a list containing empty lists for NAs in R

我有一个嵌套列表,其中一些元素为空列表(摘录):

 str(myList)
 List of 100
 $ :'data.frame':   2 obs. of  10 variables:
  ..$ _index          : chr [1:2] "alias_fr" "alias_fr"
  ..$ _type           : chr [1:2] "triplet" "triplet"
  ..$ _id             : chr [1:2] "Q9327" "Q3122270"
 $ : list()
 $ :'data.frame':   1 obs. of  9 variables:
  ..$ _index          : chr "alias_fr"
  ..$ _type           : chr "triplet"
  ..$ _id             : chr "Q17009"

我需要索引每个元素,使用 bind_rows:

df <- bind_rows(myList, .id = "id")

不幸的是,空元素(示例中的第二个)被删除,结果是糟糕的索引(索引移位):

  id   _index   _type      _id
1  1 alias_fr triplet    Q9327
2  1 alias_fr triplet Q3122270
3  2 alias_fr triplet   Q17009

我的期望:

  id   _index   _type      _id
1  1 alias_fr triplet    Q9327
2  1 alias_fr triplet Q3122270
3  2 NA       NA      NA
3  3 alias_fr triplet   Q17009

我已经尝试了几种方法都没有成功:

Convert R list to dataframe with missing/NULL elements ...

有没有办法让 bind_rows 考虑空元素?

假设

  1. 列表中的所有数据框共享相同的变量名和列数。
  2. 嵌套列表中的第一个元素不是空列表。 (这只是为了方便我以后,你可以随意选择一个元素是数据框。)

我的方法是将不是数据框的元素更改为具有 1 行 NA 且列名与其他数据框相同的元素。

change_others_to_dataframe <- function(x) {
  # If x is a data frame, do nothing and return x
  # Otherwise, return a data frame with 1 row of NAs
  if (is.data.frame(x)) {return(x)}
  else {return(setNames(data.frame(matrix(ncol = ncol(myList[[1]]), nrow = 1)),
                        names(myList[[1]])))}
}

# Apply the written function above to every element in myList
mynewList <- lapply(myList, change_others_to_dataframe)
# "bind_rows" with mynewList
df <- bind_rows(mynewList, .id = "id")

我相信这会解决您的问题。

要创建没有数据的数据框,您可以参考 SO 上的这些线程:

  • Create an empty data frame