Добавление столбца идентификатора в список фреймов данных в R - PullRequest
1 голос
/ 06 мая 2020

У меня есть список XML файлов, которые я объединяю вместе, но я пытаюсь понять, как добавить столбец "id" в каждый фрейм данных на основе имени файла.


# BUILD DATAFRAME LIST
list_filenames <- list.files(pattern = ".xml$")

df_list <- lapply(list_filenames, function(f) {

  list_ids <- as.list(list_filenames)

  doc  <- xmlParse(f, useInternalNodes = TRUE)
  doc2 <- xmlToDataFrame(doc, nodes = getNodeSet(doc, "//Event"))
  mapply(cbind, doc2, "id" = list_ids, SIMPLIFY = F)  # Code that kind of works

  })

final_df <- do.call(rbind, df_list)

Я надеюсь получить что-то вроде этого:

ex_df <- cbind(x = c(3, 2, 10, 12),
               y = c("a", "b", "c", "d"),
               id = c("file_name_1", "file_name_1", "file_name_2", "file_name_2")) %>% 
  as.data.frame()

> ex_df
   x y          id
1  3 a file_name_1
2  2 b file_name_1
3 10 c file_name_2
4 12 d file_name_2

1 Ответ

1 голос
/ 06 мая 2020

Мы можем использовать Map

nm1 <- sub("\\.xml$", "", list_filenames)
out <- do.call(rbind, Map(cbind, df_list, id = nm1))

В коде OP мы перебираем list_filenames, а затем во второй строке, используя полный набор list_filenames в

as.list(list_filenames)

Вместо этого будет просто 'f', т.е.

df_list <- lapply(list_filenames, function(f) {

  list_id <- sub("\\.xml$", "", f) #####

  doc  <- xmlParse(f, useInternalNodes = TRUE)
  doc2 <- xmlToDataFrame(doc, nodes = getNodeSet(doc, "//Event"))
  doc2$id = list_id
  doc2

  })

Тогда мы могли бы rbind элементы списка

 do.call(rbind, df_list)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...