2014-01-07 16 views
1

У меня есть много файлов в папке и вы хотите удалить несколько столбцов для каждого и вставить новый столбец. Я могу сделать это один файл одновременно со следующим кодом:Удаление переменных для всех файлов в папке?

df <- read.csv("C:\\Users\\name\\Documents\\CSV Files\\1\\30335\\file1.csv") 
df <- df[-c(6:34)] 
df$newcolumn <- df$column1-df$column2 
write.table(df, file = "C:\\Users\\name\\Documents\\CSV Files\\1\\30335\\file1.csv", 
sep = ",", dec = ".", col.names = T, row.names = F) 

Однако, я хотел бы сделать это для всех файлов в папке просто запустить его один раз.

Заранее благодарим за помощь.

+0

@agstudy Это было бы получить только часть пути OP есть. Речь идет не о создании массива объектов, хотя это может стать частью решения, а 'list.files()' очень полезно здесь. –

+0

@GavinSimpson Я согласен, что это не хорошо продублировано, но это, безусловно, дублированный вопрос (я помню, как много раз отвечал на такой вопрос). – agstudy

+0

@agstudy Я думаю, вы можете быть правы. Если вы сможете найти лучший дубликат, я тоже добавлю к нему заочное голосование. –

ответ

2

Вот один подход:

path <- "C:\\Users\\name\\Documents\\CSV Files\\1\\30335" 

files <- list.files(path = path) 

lapply(files, function(file) { 
    fp <- file.path(path, file) 
    df <- read.csv(fp)[-6:34] 
    df$newcolumn <- df$column1 - df$column2 
    write.table(df, file = fp, 
       sep = ",", dec = ".", col.names = TRUE, row.names = FALSE) 
}) 
4

Во-первых, некоторые фиктивные данные для работы с

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 
} 
+0

+1! Я не знаю этого: 'glob2rx'! – agstudy

+1

@agstudy Это очень полезно. Если вы посмотрите на свой ответ в Q & A, который вы предлагаете в качестве близкого вопроса, вы использовали 'pattern =" * .csv "' в вызове 'list.files()'. Поскольку это регулярное выражение, оно будет соответствовать файлам, которые не имеют расширения '.csv'. Он будет соответствовать * anything * с '' csv "' в имени файла, включая '" foocsvbar.txt "'. –

Смежные вопросы