簡體   English   中英

列表中的數據清理后,綁定列表中的數據幀

[英]Binding dataframes in list after data cleaning on 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,但是我不確定如何在這里使用它?

如果你有數據幀列表dat我會建議

df <- dplyr::bind_rows(dat)

將它們行綁定到一個大數據幀。

或者,您應該使用purrr映射系列並直接返回行綁定的data.frame?

df <- purrr::map_dfr(file.list, function(x) readxl::read_xslx(x))

我找到了解決方案!!

謝謝您的幫助!

顯然問題不在於嵌套列表中數據幀的綁定。 問題是我以錯誤的方式更改了列類型。

這是我的代碼-它可以正常工作! 而且它比另一個超級快!

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)

我想贊揚我偷走了第一部分的人,但我不記得了...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM