这是我最后一个问题(Rbinding large list of dataframes after I did some data cleaning on the list)的跟进。我变得更聪明了,以前的问题变得一团糟。
我有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,但是我不确定在这里如何使用它?
答案 0 :(得分:0)
如果您有数据帧列表dat
,我建议
df <- dplyr::bind_rows(dat)
将它们行绑定到一个大数据帧。
或者您应该使用purrr映射系列并直接返回行绑定的data.frame吗?
df <- purrr::map_dfr(file.list, function(x) readxl::read_xslx(x))
答案 1 :(得分:0)
我找到了解决方案!
谢谢您的帮助!
显然,问题不在于嵌套列表中数据帧的绑定。问题是我以错误的方式更改了列类型。
这是我的代码-它有效!而且它比另一种超级快!
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和@Probel)
我想赞扬我偷走了第一部分的人,但我不记得了...