因此,讓我確認之前,我開始,我明白問:
- 有關文件夾中的每個文件,
- 導入文件作爲數據幀
- 下降一些列
- 重命名其餘列
- 將數據框中的列設置爲從文件名
中獲得的值3210
- 刪除包含字符串「N/A」的任何地方
- 然後情況下,由每個所產生的數據幀組合到一個數據幀UNION-ING它們(即,添加的行一起因爲列應一樣)。
您提供任何此類問題的數據至關重要。如果您無法提供您的具體數據,請創建一些仍能證明問題即將出現的假數據。然後,舉例說明一旦操作完成後它應該是什麼樣子。這可以減少回答你問題的人的猜測。
因此,儘管如此,讓我們開始吧。
讓我們假設我們有一個函數process_a_file
抽象出任務#1的子部分,它將執行每個單獨文件的步驟1-5並返回一個數據幀。我可以在後面解釋這個功能的作用。
對於「每個文件」部分,您需要lapply
。lapply
運行提供列表中的每個元素在一個給定的功能,並返回該函數返回什麼的列表:
results_list <- lapply(files, process_a_file)
這將返回一個列表,該列表中的每個元素是process_a_file
返回的數據幀。然後,你需要一個功能,把它們混合起來 - 我建議bind_rows
從包裝dplyr
:
results_df <- dplyr::bind_rows(results_list)
而這一切,你需要做的!
那麼,現在,我們在process_a_file
中放什麼?這是很容易 - 你的代碼是這樣做的主要是完整的,但也有一些不同的方式來做到這一點,我喜歡:)
process_a_file <- function(filename) {
#???????
}
第1步是將文件導入的數據幀。爲此,我建議read_delim
從readr
包 - 它比默認的[R方法快得多,具有良好的默認值,讓我們通過指定「N/A」是指解決在同一時間第5步NA
:
df <- readr::read_delim(filename, delim = " ", col_names = FALSE, na = "N/A")
對於第2步,用自己的方式工作,但我還建議從dplyr
的select
功能:
dplyr::select(df, 2:5,9,10,12,1)
您還可以索引列與不帶引號的名稱,並與-5
或-column_name
太刪除列 - 你可以做第3步與此同時!
df <- dplyr::select(
df,
GMT_Date = 2,
GMT_Time = 3,
LMT_Date = 4,
LMT_Time = 5,
Latitude = 9,
Longitude = 10,
PDOP = 12,
`2D_3D` = 13
)
重命名列的方式也很好。順便說一句,如果你用一個數字開始一個列名,你必須在任何地方使用這個`backtick`語法,所以這很不方便,如果可以的話,你應該避免它。
最後,我建議使用正則表達式從文件名中獲取ID。我假設你可以編寫正則表達式,因爲這真的超出了範圍 - 所以你可以使用basename(tools::file_path_sans_ext(filename)
返回沒有路徑或擴展名的文件名,並使用stringr::str_extract
彈出ID,然後使用dplyr添加到列::變異
dplyr::mutate(df, animal_id = stringr::str_extract(basename(tools::file_path_sans_ext(filename)), "THE REGEX GOES HERE"))
所以,現在,把這個一起 - 使用dplyr的管道語法%>%
,以使它看起來不錯:
process_a_file <- function(filename) {
readr::read_delim(filename,
delim = " ",
col_names = FALSE,
na = "N/A") %>%
dplyr::select(
GMT_Date = 2,
GMT_Time = 3,
LMT_Date = 4,
LMT_Time = 5,
Latitude = 9,
Longitude = 10,
PDOP = 12,
`2D_3D` = 13
) %>%
dplyr::mutate(animal_id = stringr::str_extract(basename(tools::file_path_sans_ext(filename)), "THE REGEX GOES HERE"))
}
results_list <- lapply(files, process_a_file)
results_df <- dplyr::bind_rows(results_list)
完美地工作!謝謝! – Buck2079
@ Buck2079很高興能夠聽到它:)如果你願意接受答案,我將不勝感激......雖然我不是代表它的! (我是。) – Balter