Во-первых, некоторые фиктивные данные для работы с
for (i in seq_len(3)) {
df <- data.frame(A = runif(10), B = runif(10), C = runif(10))
fname <- paste0("./df", i, ".csv")
write.csv(df, fname, row.names = FALSE)
}
Ok, первый список в .csv
файлы в каталоге:
path <- "~/"
fs <- list.files(path, pattern = glob2rx("*.csv"))
, который дает
R> fs
[1] "df1.csv" "df2.csv" "df3.csv"
Далее цикл по набору файлов
for (f in fs) {
fname <- file.path(path, f) ## current file name
df <- read.csv(fname) ## read file
df <- df[, -2] ## delete column B
df$D <- df[, 1] + df[, 2] ## add something
write.csv(df, fname, row.names = FALSE) ## write it out
}
Вот это, но просто проверить это сработало:
R> read.csv(file.path(path, fs[1]))
A C D
1 0.71253 0.405461 1.1180
2 0.83507 0.353672 1.1887
3 0.61541 0.018851 0.6343
4 0.92108 0.006301 0.9274
5 0.07466 0.570673 0.6453
6 0.81803 0.160932 0.9790
7 0.50841 0.935930 1.4443
8 0.64912 0.965246 1.6144
9 0.31503 0.946411 1.2614
10 0.41563 0.212671 0.6283
Полный сценарий:
path <- "~/"
fs <- list.files(path, pattern = glob2rx("*.csv"))
for (f in fs) {
fname <- file.path(path, f) ## current file name
df <- read.csv(fname) ## read file
df <- df[, -2] ## delete column B
df$D <- df[, 1] + df[, 2] ## add something
write.csv(df, fname, row.names = FALSE) ## write it out
}
glob2rx()
вызов преобразует glob файла в регулярное выражение, так что только файлы с .csv
расширения. Если вы знали регулярные выражения, вы могли бы написать это самостоятельно, но glob2rx()
- это яркий ярлык для тех, кто не говорит о регулярных выражениях.
По существу, решение выше и решение Свена очень похожи. Я предпочитаю подход петли здесь, как создание анонимной функции, хотя и совсем не сложно, - это один шаг, удаленный от реальной проблемы, а именно просто последовательность шагов один за другим и, на мой взгляд, это наиболее четко продемонстрировано через петлю. Но это чисто личное предпочтение.
для вашего конкретного примера, не тестируется, как у меня нет вашей установки, вам потребуется:
path <- "C:\\Users\\name\\Documents\\CSV Files\\1\\30335"
fs <- list.files(path, pattern = glob2rx("*.csv"))
for (f in fs) {
fname <- file.path(path, f) ## current file name
df <- read.csv(fname) ## read file
df <- df[, -(6:34)] ## delete columns
df$D <- df[, "column1"] + df[, "column2"] ## add new column
write.csv(df, fname, row.names = FALSE) ## write it out
}
@agstudy Это было бы получить только часть пути OP есть. Речь идет не о создании массива объектов, хотя это может стать частью решения, а 'list.files()' очень полезно здесь. –
@GavinSimpson Я согласен, что это не хорошо продублировано, но это, безусловно, дублированный вопрос (я помню, как много раз отвечал на такой вопрос). – agstudy
@agstudy Я думаю, вы можете быть правы. Если вы сможете найти лучший дубликат, я тоже добавлю к нему заочное голосование. –