我正在嘗試上傳多個 excels 檔案(相同的 excel 格式),每個檔案都有多個作業表,本質上每個 excel 檔案都有關于酒店預訂的資訊,每個作業表都是一個月的資訊(1 月、2 月、10 月)每個檔案都是不同酒店名稱的資訊(fi hilton, paris, Vac_in)來說明一下我們在作業目錄中有兩個檔案,第一個檔案代表希爾頓酒店的預訂,第二個檔案是巴黎酒店,檔案一個(希爾頓)有 3 張名為“jan”、“feb”和“mar”的作業表,檔案 2(巴黎酒店)也是如此
每張紙(關于檔案在..總是有相同的列名)所以在這個程序結束時,我希望所有資料都匯入一個完整dataframe的,我試圖添加兩個新的 colomuns 一個名稱為excel 檔案和另一個它從以下內容獲取資訊的作業表的名稱:
| ID | 成本 | “檔案名” | “作業表名稱” |
|---|---|---|---|
| 一種 | 5 | 希爾頓 | 簡 |
| X | 8 | 希爾頓 | 簡 |
| 乙 | 1 | 希爾頓 | 二月 |
| C | 2 | 希爾頓 | 三月 |
| R | 59 | 巴黎 | 簡 |
| G | 22 | 巴黎 | 二月 |
| ü | 10 | 巴黎 | 三月 |
| W | 78 | 巴黎 | 三月 |
我會得到上面想要的結果,因為第一個檔案的名稱是“Hilton”,并且在一個名為“Jan”的作業表中有兩行資訊,在作業表“Feb”中有一行資訊,與第二個檔案的名稱相同“巴黎”,有一張名為 Jan、Feb 的床單,并從中取出所有行并將其放入完整dataframe
我可以使用以下代碼成功上傳每個檔案及其作業表中的所有資訊:
library(tidyverse)
library(fs)
library(readxl)
path <- fs::dir_ls(choose.dir())
read_all_files_&_sheets <- function(path) {
path %>%
excel_sheets() %>%
set_names() %>%
map_df(read_excel, path = path)
}
data <- path%>%
map(read_all_files_)
full_db<-bind_rows(data)
但是我找不到變異和創建新列“檔案名”和“表名”的方法,我已經嘗試了幾個小時,但我只得到錯誤,如果你能幫助我或參考博客或一本可以讓我學習如何做的書,非常感謝
uj5u.com熱心網友回復:
稍微改變你的功能怎么樣,像這樣:
read_all_files_<- function(path) {
path %>%
excel_sheets() %>%
set_names() %>%
map_df(~read_excel(.x, path = path) %>% mutate(file=path, sheet=.x))
}
解釋:
假設您的路徑向量(即路徑 [1])中的第一個檔案是"<folder_structure>hilton.xlsx". 然后,當您將此字串傳遞給 時read_all_files_(),管道通過的結果set_names()是作業表的命名串列
Jan Feb Mar
"Jan" "Feb" "Mar"
然后,您將這三個作業表名稱通過管道傳輸到map_df(). 雖然map_df(read_excel, path=path)會為您回傳資料,但您需要調整函式以另外改變map_df()將要回傳的幀。因此.f=read_excel,我們將其更改為,而不是.f=~read_excel(.x, path=path) %>% mutate(....),其中mutate部分添加了這兩列,file并且sheet分配了path和作業表的值,即.x。
希望這可以幫助。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/433503.html
上一篇:使用帶有狀態物件的擴展(...)運算子實作所需結果的問題
下一篇:回傳不是數字的最后一個單詞
