Моя проблема в том, что я не могу объединить большой список фреймов данных перед выполнением некоторой очистки данных.Но похоже, что моя очистка данных отсутствует в списке.
У меня есть 43 xlsx-файла, которые я поместил в список.
Вот мой код для этой части:
file.list <- list.files(recursive=T,pattern='*.xlsx')
dat = lapply(file.list, function(i){
x = read.xlsx(i, sheet=1, startRow=2, colNames = T,
skipEmptyCols = T, skipEmptyRows = T)
# Create column with file name
x$file = i
# Return data
x
})
Затем я провел некоторую очистку данных.У некоторых из фреймов данных были некоторые пустые столбцы, которые не были пропущены при загрузке, а некоторые столбцы мне просто не нужны.
Пример того, как я удалил один столбец (X1) из всех фреймов данных в списке:
dat <- lapply(dat, function(x) { x["X1"] <- NULL; x })
Я также применяю имена столбцов:
colnames <- c("ID", "UDLIGNNR","BILAGNR", "AKT", "BA",
"IART", "HTRANS", "DTRANS", "BELOB", "REGD",
"BOGFD", "AFVBOGFD", "VALORD", "UDLIGND",
"UÅ", "AFSTEMNGL", "NRBASIS", "SPECIFIK1",
"SPECIFIK2", "SPECIFIK3", "PERIODE","FILE")
dat <- lapply(dat, setNames, colnames)
Моя проблема, когда я открываю список или смотрю на элементы в списке, моя очистка данных отсутствует.
И я не могу связать кадры данных до очистки данных, поскольку они не выглядят одинаково.
Что я здесь не так делаю?
РЕДАКТИРОВАТЬ: выборочные данные *
# Sample data
a <- c("a","b","c")
b <- c(1,2,3)
X1 <- c("", "","")
c <- c("a","b","c")
X2 <- c(1,2,3)
X1 <- c("", "","")
df1 <- data.frame(a,b,c,X1)
df2 <- data.frame(a,b,c,X1,X2)
# Putting in list
dat <- list(df1,df2)
# Removing unwanted columns
dat <- lapply(dat, function(x) { x["X1"] <- NULL; x })
dat <- lapply(dat, function(x) { x["X2"] <- NULL; x })
# Setting column names
colnames <- c("Alpha", "Beta", "Gamma")
dat <- lapply(dat, setNames, colnames)
# Merging dataframes
df <- do.call(rbind,dat)
Итак, я только что обнаружил, что с моими выборочными данными все идет гладко.Мне пришлось заново открыть список в режиме просмотра, чтобы увидеть сделанные мной изменения.Это не меняет того факта, что при записи в csv и повторном открытии вся очистка данных отсутствует (не пытался это сделать с моими примерами данных).
Мне интересно, не потому ли, что я изменил слияние?
# My merge when I wrote this question:
df <- do.call("rbindlist", dat)
# My merge now:
df <- do.call(rbind,dat)
Когда я использую свои реальные данные, все идет не так гладко, так что я думаю, что пример данных плохой.Я не знаю, что я делаю неправильно, поэтому я не могу дать более качественные данные.
Сообщение, которое я получаю при слиянии с rbind:
error in rbind(deparse.level ...) numbers of columns of arguments do not match