[英]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.