我在一個目錄中有大量 csv 檔案,我需要根據另一個索引/參考資料框中的相應列重命名這些檔案。這是我正在處理的三個元素示例:
dir.create("dir1")
write.csv(mtcars[1:2,], "dir1/20821659.csv", row.names=FALSE)
write.csv(mtcars[3:4,], "dir1/20821654.csv", row.names=FALSE)
write.csv(mtcars[5:6,], "dir1/20821657.csv", row.names=FALSE)
現在我有另一個資料框,其中一列中這些檔案的原始名稱,以及我想用來重命名它們的另一列:
location <- c("SFM01_2", "SFM05_2", "02M08_2")
sn <- c("20821659", "20821654", "20821657")
df<- data.frame(location, sn)
例如,與第一個檔案名 (20821659) 對應的位置名稱是 SFM01_2,我想將該檔案夾中的所有檔案的檔案名更改為 SFM01_2 等等。
uj5u.com熱心網友回復:
您可以遍歷行,每次使用paste0()來創建一個mv命令,然后將其提供給system()
purrr::walk(1:nrow(df),function(i) {
cmd = paste0("mv dir1/",df[["sn"]][i], ".csv dir1/", df[["location"]][i], ".csv")
system(command=cmd)
})
uj5u.com熱心網友回復:
經測驗。file.rename成功回傳TRUE。
dir1 <- "dir1"
apply(df, 1, \(x) {
new <- paste0(x[1], ".csv")
new <- file.path(dir1, new)
old <- paste0(x[2], ".csv")
old <- file.path(dir1, old)
if(file.exists(old)) file.rename(old, new)
})
#[1] TRUE TRUE TRUE
uj5u.com熱心網友回復:
這是一個使用mapply. 您可以使用檔案的完整路徑創建一個新的資料框。然后,使用 2 列的規范逐行重命名檔案。
dir.create("dir1")
write.csv(mtcars[1:2,], "dir1/20821659.csv", row.names=FALSE)
write.csv(mtcars[3:4,], "dir1/20821654.csv", row.names=FALSE)
write.csv(mtcars[5:6,], "dir1/20821657.csv", row.names=FALSE)
list.files('dir1') # "20821654.csv" "20821657.csv" "20821659.csv"
location <- c("SFM01_2", "SFM05_2", "02M08_2")
sn <- c("20821659", "20821654", "20821657")
df<- data.frame(location, sn)
# Create a new dataframe with the full paths of the files
df2 <- sapply(df, function(i){
paste0('dir1/', i, '.csv')
})
# rename the file using the specification of the 2 columns row by row
mapply(FUN = file.rename, from = df2[, 2], to = df2[, 1],
MoreArgs = NULL, SIMPLIFY = TRUE, USE.NAMES = TRUE)
list.files('dir1') # "02M08_2.csv" "SFM01_2.csv" "SFM05_2.csv"
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/478167.html
