我正在處理許多標有括號中月份的 csv 檔案。例如:
files_names <- list.files("data/", recursive = TRUE, full.names = TRUE)
[1] "data/BOC_All_ATMImage_(Aug 2020).txt" "data/BOC_All_ATMImage_(Aug 2021).txt"
[3] "data/BOC_All_ATMImage_(Feb 2021).txt" "data/BOC_All_ATMImage_(Feb_2020).txt"
[5] "data/BOC_All_ATMImage_(May 2021).txt" "data/BOC_All_ATMImage_(Nov 2019).txt"
column_names <- files_names %>%
str_extract(., "(?<=\\().*?(?=\\))") %>%
str_to_lower() %>%
str_replace(., " ", "_")
"aug_2020" "aug_2021" "feb_2021" "feb_2020" "may_2021" "nov_2019"
我正在使用map2函式 inpurrr來處理 csv 檔案并使用files_names和column_names在回圈中設定列名。
data <-
map2(files_names, column_names,
~ read_csv(.x, guess_max = 50000) %>%
mutate(
day = 01,
month_year = str_extract(.x, "(?<=\\().*?(?=\\))"),
date_dmy = paste0(day, "-", month_year),
date = dmy(date_dmy),
"{.y}" := 1
),
.id = "group"
)
我需要弄清楚如何排列這個串列,以便每個資料集都按時間順序排列。一種方法是在將初始字符向量(files_names和column_names)送入回圈之前對其進行排列。或者,簡單地排列data串列以便資料幀按時間順序排列可能會更容易?我date在每個資料框中創建了一個變數,所以這可能是另一種方法,但我不確定如何按日期變數重新排序串列。
uj5u.com熱心網友回復:
我們可以使用str_match來搜索幾個月和幾年。之后,使用一些dplyr來清理資料。我想用一個因素來安排月份。
library(tidyverse)
files_names <-
c(
"data/BOC_All_ATMImage_(Aug 2020).txt", "data/BOC_All_ATMImage_(Aug 2021).txt",
"data/BOC_All_ATMImage_(Feb 2021).txt", "data/BOC_All_ATMImage_(Feb_2020).txt",
"data/BOC_All_ATMImage_(May 2021).txt", "data/BOC_All_ATMImage_(Nov 2019).txt"
)
factor_w_month <- partial(factor, levels = )
months <- partial(factor, levels = (c("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec")))
files_names %>%
str_match(".*_\\((.*)[ _](\\d )\\)\\.txt$") %>%
as.data.frame() %>%
mutate(V2 = months(V2)) %>%
arrange(V3, V2) %>%
transmute(files_names = V1, column_names = str_to_lower(str_c(V2, '_', V3)))
#> files_names column_names
#> 1 data/BOC_All_ATMImage_(Nov 2019).txt nov_2019
#> 2 data/BOC_All_ATMImage_(Feb_2020).txt feb_2020
#> 3 data/BOC_All_ATMImage_(Aug 2020).txt aug_2020
#> 4 data/BOC_All_ATMImage_(Feb 2021).txt feb_2021
#> 5 data/BOC_All_ATMImage_(May 2021).txt may_2021
#> 6 data/BOC_All_ATMImage_(Aug 2021).txt aug_2021
由reprex 包(v2.0.1)于 2021 年 12 月 20 日創建
uj5u.com熱心網友回復:
我認為以下解決方案還可以幫助您在開始將日期讀入 R 之前對日期進行排序:
library(dplyr)
library(stringr)
files_names %>%
enframe() %>%
mutate(date = str_extract(value, "(?<=\\().*(?=\\))"),
date = paste(str_extract(date, "\\d "), str_extract(date, "[[:alpha:]] "), "01",
sep = "-"),
date = as.Date(date, format = "%Y-%b-%d")) %>%
arrange(desc(date))
# A tibble: 6 x 3
name value date
<int> <chr> <date>
1 2 data/BOC_All_ATMImage_(Aug 2021).txt 2021-08-01
2 5 data/BOC_All_ATMImage_(May 2021).txt 2021-05-01
3 3 data/BOC_All_ATMImage_(Feb 2021).txt 2021-02-01
4 1 data/BOC_All_ATMImage_(Aug 2020).txt 2020-08-01
5 4 data/BOC_All_ATMImage_(Feb_2020).txt 2020-02-01
6 6 data/BOC_All_ATMImage_(Nov 2019).txt 2019-11-01
還有一些關于你使用的正則運算式的小提示,我認為你不需要讓.*部分變得懶惰。
uj5u.com熱心網友回復:
通過決議和排序 column_names 中的日期,您可以按時間順序排列您的 files_names 并從那里處理您的檔案
files_names <- list.files("data/", recursive = TRUE, full.names = TRUE)
column_names <- files_names %>%
str_extract(., "(?<=\\().*?(?=\\))") %>%
str_to_lower() %>%
str_replace(., " ", "_")
files_names <- files_names[
order(readr::parse_date(column_names,"%b_%Y"))]
files_names
[1] "data/BOC_All_ATMImage_(Nov 2019).txt"
[2] "data/BOC_All_ATMImage_(Feb_2020).txt"
[3] "data/BOC_All_ATMImage_(Aug 2020).txt"
[4] "data/BOC_All_ATMImage_(Feb 2021).txt"
[5] "data/BOC_All_ATMImage_(May 2021).txt"
[6] "data/BOC_All_ATMImage_(Aug 2021).txt"
uj5u.com熱心網友回復:
如果沒有 csv 檔案,我真的無法運行您的代碼,但看起來您已經有了一個小標題串列,并且您已經使用檔案名中的片段添加了一個日期列。在這種情況下,您只需要
data %>% bind_rows() %>% arrange(date)
獲取單個小標題,但根據檔案名中的日期對行進行排序。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/388507.html
