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 行 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
我有一个嵌套列表,其中一些元素为空列表(摘录):
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 行 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