rbinding со списком, содержащим пустые списки для НА в 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

Я уже безуспешно пробовал несколько методов:

Функция для изменения Null на NA

Преобразовать список R в фрейм данных с отсутствующими элементами / NULL ...

Есть ли способ сделать так, чтобы пустые элементы учитывались с помощью bind_rows?


person Tau    schedule 23.01.2018    source источник
comment
Вам действительно нужны эти строки NA? Если вам просто нужны правильные идентификационные номера, вы должны использовать именованный список. В этом случае отбрасываются пустые элементы списка, но сохраняются правильные идентификаторы.   -  person talat    schedule 23.01.2018
comment
Да, мне нужны эти строки для будущего соединения (каждый идентификатор соответствует данному предложению в корпусе). У меня нет другого элемента, чтобы объединение было эффективным ...   -  person Tau    schedule 23.01.2018


Ответы (1)


При условии, что

  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:

person ytu    schedule 23.01.2018
comment
Спасибо ytu, ты босс! - person Tau; 23.01.2018