Привязка кадров данных в списке после очистки данных в списке - PullRequest
0 голосов
/ 08 февраля 2019

Это продолжение моего последнего вопроса ( Переплет большого списка данных после того, как я провел некоторую очистку данных в списке ).Я стал умнее, а первый вопрос запутался.

У меня есть 43 xlsx файла, которые я загрузил в список в R:

file.list <- list.files(recursive=T,pattern='*.xlsx')

dat = lapply(file.list, function(i){
x = read_xlsx(i, sheet=1, col_names = T)

# Create column with file name  
x$file = i
# Return data
x
})

Затем я добавил несколько имен столбцов:

my_names <- c("ID", "UDLIGNNR","BILAGNR", "AKT", "BA",
          "IART", "HTRANS", "DTRANS", "BELOB", "REGD",
          "BOGFD", "VALORD", "UDLIGND", 
          "UÅ", "AFSTEMNGL", "NRBASIS","FIBILAG", "FILE")
dat <- lapply(dat, setNames, my_names)

Затем я удалил некоторыеколонки:

dat <- lapply(dat, function(x) { x["UÅ"] <- NULL; x })
dat <- lapply(dat, function(x) { x["FIBILAG"] <- NULL; x })

Мне не нужно их удалять, но когда я пытался объединить кадры данных, я продолжал получать сообщения об их классе.Поэтому я просто удалил их.

Затем я изменяю все свои столбцы на символы.Я немного новичок в R, так что я знаю, что этот код не очень сексуален, и вы, вероятно, могли бы сделать цикл или только одну функцию для этого.Но вот что я сделал:

dat <- lapply(dat, function(x) { x["ID"] <- as.character(x["ID"]); x })

[Я сделал то же самое для всех столбцов]

А потом я иду и связываю данные.

df <- rbindlist(dat)

РЕДАКТИРОВАТЬ:

Я обнаружил, что проблема не в моих методах привязки (спасибо за ваш вклад в это).Я удалил часть о методах привязки.

Проблема заключается в том, как я изменяю типы столбцов в моих столбцах в моих фреймах данных в списке.

Я также пробовал:

    dat <- lapply(dat, function(x) { x[,"ID"] <- as.character(x[,"ID"]); x })

Я добавил запятую перед "ID".Это не помогло.Я чувствую, что мне нужно использовать unlist, но я не уверен, как использовать это здесь?

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

Я нашел решение !!

Спасибо за вашу помощь!

Видимо, проблема заключалась не в привязке фреймов данных во вложенном списке,Проблема заключалась в том, что я неправильно изменял типы столбцов.

Вот мой код - и он работает!И это супер быстрее, чем другие!

file.list <- list.files(recursive=T,pattern='*.xlsx')

dat = lapply(file.list, function(i){
x = read_xlsx(i, sheet=1, col_names = T)

# Create column with file name  
x$file = i
# Return data
x
})

# Setting column names
my_names <- c("ID", "UDLIGNNR","BILAGNR", "AKT", "BA",
          "IART", "HTRANS", "DTRANS", "BELOB", "REGD",
          "BOGFD", "VALORD", "UDLIGND", 
          "UÅ", "AFSTEMNGL", "NRBASIS","FIBILAG", "FILE")

dat <- lapply(dat, setNames, my_names)

# Removing problematic columns
dat <- lapply(dat, function(x) { x["UÅ"] <- NULL; x })
dat <- lapply(dat, function(x) { x["FIBILAG"] <- NULL; x })


dat2 <- lapply(dat, function(df) setDT(df)[, (1:16) := lapply(.SD, as.character), .SDcols = 1:16])

# Merging
df <- rbindlist(dat2)

О, и несколько человек сказали мне использовать bind_rows вместо этого (@atomman and @Probel)

И я хочу отдать должное человекуу кого я украл первую часть, но не помню ...

0 голосов
/ 08 февраля 2019

Если у вас есть список фреймов данных dat, я бы порекомендовал

df <- dplyr::bind_rows(dat)

, чтобы связать строки в один большой фрейм данных.

В качестве альтернативы вам следует использовать семейство карт мурлыканияи вернуть строку в привязке data.frame напрямую?

df <- purrr::map_dfr(file.list, function(x) readxl::read_xslx(x))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...