我的问题是,在进行某些数据清理之前,我无法合并大量数据帧。但似乎我的数据清除从列表中丢失了。
我有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并重新打开所有数据时,缺少数据清理(haven'tr在我的示例数据中尝试了此操作)。
我想知道是否是因为我更改了合并?
# 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