簡體   English   中英

讀取和綁定在 R 中具有不同列的多個 CSV 文件

[英]Reading and binding multiple CSV files that have different columns in R

我想讀取多個具有不同列號和名稱的 CSV 文件並將它們綁定在一起。 當所有文件的列數相同時,我知道如何執行此操作,但我在列數不同的情況下苦苦掙扎。

我在文件中識別出一個模式,可以幫助我完成我的流程。 我基本上想跳過前 2 列,保留第 3 列,跳過接下來的兩列,保留接下來的 8 列,並跳過后面的任何列。

這是讀取所有文件的函數。 我想忽略標題,因為列名不同,我使用 col 類刪除我不想要的列。 我也只指定我想要 1-18 行。 我將 csv 文件的路徑添加為列名,以標識它來自哪個文件。

read_fun = function(path){
  test = read.csv(path, sep=",", header=F, fill = TRUE, colClasses = c(rep("NULL",2), "character",rep("NULL",2),
                                                                                   rep("character",8), rep("NULL",5)),
                  skip = 1, nrows = 17)
  test$question = path
  test
}

然后我使用 map 來行綁定所有文件。

FileList = list.files(pattern = "*.csv",
                      full.names=FALSE,recursive = T)

# read_fun(allfiles[1])
combined_dat <- map_dfr(allfiles,read_fun)

****編輯:我確實得到了我正在尋找的合並文件,但有一個例外; 綁定新文件時,某些行(某些文件的)被附加到新列,當我運行 map_dfr 時出現此警告:

New names:
* `` -> ...1
* `` -> ...2
* `` -> ...3
* `` -> ...4
* `` -> ...5
* ...
New names:
* `` -> ...1
* `` -> ...2
* `` -> ...3
* `` -> ...4
* `` -> ...5
* ...
New names:
* `` -> ...9
New names:
* `` -> ...7
* `` -> ...8
* `` -> ...9
New names:
* `` -> ...4
* `` -> ...5
* `` -> ...6
* `` -> ...7
* `` -> ...8
* ...

這會產生大約 11 個無意義的變量,使數據變得毫無意義。 行綁定未按預期工作。 我的懷疑是 map_dfr 不知道如何處理這種數據。

當我讀入沒有指定最大列數的文件時出現此錯誤(某些文件中有 18 列,其他文件有 15 列)。 這在技術上不應該是一個問題,因為如果我通過 col 類指定 18 列,它應該只讀取額外的列作為空白,這很好。

Warning message:
In read.table(file = file, header = header, sep = sep, quote = quote,  :
  cols = 18 != length(data) = 16

對不起,我不知道如何重現這個問題。 如果您有任何建議,我將不勝感激!

當我遇到類似問題時,我會創建索引數據(通常在 Excel 中創建),其中索引數據的第一列定義了您要為每個數據列指定的名稱,然后每個后續列在每個文件中都有實際名稱。 然后我將文件名映射到所需的名稱以使所有內容保持一致。

類似的方法可能對您有用:

library(dplyr)

df1 <- tibble(a1 = 1:2, b1 = letters[1:2], c1 = NA)
df2 <- tibble(a2 = 3:4, b2 = letters[3:4])

ref <- tibble(id = c("a", "b"), df1 = c("a1", "b1"), df2 = c("a2", "b2"))

names(df1) <- sapply(names(df1), function(x, d) ifelse(x %in% d[["df1"]], d[d[["df1"]] == x,]$id, x), d = ref)
names(df2) <- sapply(names(df2), function(x, d) ifelse(x %in% d[["df2"]], d[d[["df2"]] == x,]$id, x), d = ref)

bind_rows(df1, df2)

這可以在函數中做得更整潔一些。

暫無
暫無

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

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