列表中的数据清理后,绑定列表中的数据帧

时间:2019-02-08 11:24:23

标签: r merge rbind rbindlist

这是我最后一个问题(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,但是我不确定在这里如何使用它?

2 个答案:

答案 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)

我想赞扬我偷走了第一部分的人,但我不记得了...