0

这是对我最后一个问题的跟进(在我对列表进行了一些数据清理之后,Rbinding large list of dataframes)。我变得更聪明了,前一个问题变得一团糟。

我有 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)

编辑:

我发现问题不是我的绑定方法(感谢您对此的投入)。我已经删除了关于绑定方法的部分。

问题在于我如何更改列表中数据框中列的 coltypes。

我也试过:

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

我在“ID”之前添加了一个逗号。这没有帮助。我觉得我需要使用 unlist,但我不确定如何在这里使用它?

4

2 回答 2

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)

我想感谢我偷了第一部分的人,但我不记得了……

于 2019-02-08T15:42:59.760 回答
0

如果您有数据框列表,dat我会推荐

df <- dplyr::bind_rows(dat)

将它们行绑定到一个大数据框。

或者,您应该使用 purrr 地图系列并直接返回行绑定的 data.frame?

df <- purrr::map_dfr(file.list, function(x) readxl::read_xslx(x))
于 2019-02-08T14:01:39.873 回答