2013-09-11 2 views
-1

Итак, я настроил цикл ... однако мои файлы, которые я хочу перебрать (скажем, 10), находятся в разных каталогах, но шаблон пути аналогично, за исключением того, что число изменяется в зависимости от того, в какой семье его до.Как перебрать файлы в разных каталогах [R]

Например, у меня есть код, написанный, как это:

for(i in 1:numfiles) { 
olddata <- read.table(paste("/home/smith/Family",i,"/Family",i,".txt",sep="\t"),header=T) 

Some code 

write.table(newdata,(paste("/home/smith/Family",i,"/Family",i,"test.txt",sep=",",quote=F,row.names=F) 

}

Единственная проблема у меня есть, что семейные номера не идут в числовом порядке. Некоторые из них помечены как раз числом (скажем, 2), а у других есть письмо, прилагаемое к этому номеру (скажем, 1a)

Во-первых, ему не нравятся «numfiles», а также мне говорят, что есть лишняя скользящая скобка в конце моего кода. Я написал функцию в своем «некотором коде», поэтому не знаю, может ли быть проблема с этим .

Я по отношению к новым R, так что любая помощь будет высоко оценен

+0

Не должны это: 'paste0 ("/home/smith/Family ", i,"/Family ", i,". txt "), sep =" \ t "' Кажется, что вы вставляете путь к файлу со вкладкой -разделитель. То же самое для 'write.table'. – harkmug

+0

Вы правы. Тем не менее, у него все еще возникают проблемы с использованием «for (i in 1: numfiles)» ... правильно ли я это использую? – user2726449

+0

@ user2726449 * все * файлы, которые вы хотите содержать в подкаталогах под * smith *, и делать * только * файлы, которые вы хотите, принимают форму '' Family .... txt "'? –

ответ

7

Посмотрите ?list.files и ?dir, например:

files <- list.files("/home/smith", pattern="Family[[:alnum:]]+.txt", recursive=TRUE, full.names=TRUE) 

for (currentFile in files) { 
    olddata <- read.table(currentFile, header=TRUE) 
    ## some code 
    write.table(newdata, file=sub(pattern=".txt$", replacement="test.txt", x=currentFile)) 
} 

Или:

dirs <- dir("/home/smith", pattern="Family[[:alnum:]]+$") 

fileName <- file.path(dirs, paste0(dirs, ".txt")) 
testFileName <- file.path(dirs, paste0(dirs, "_test.txt")) 

for (i in seq(along=fileName)) 

    olddata <- read.table(fileName[i], header=TRUE) 
    ## some code 
    write.table(newdata, file=testFileName[i]) 
} 
+0

+1 И у меня все это было напечатано и готово к работе. Слишком быстро! :-) –

+0

Большое спасибо - второе решение на самом деле мне очень помогло. Пришлось изменить несколько вещей вокруг, но в итоге это сработало. – user2726449

+0

Сказав это: после того, как он работал некоторое время - теперь он начал давать мне «Ошибка в isOpen (файл,« w »): недействительное соединение; Кроме того: Предупреждающее сообщение: В файле if (file ==") <- stdout() else if (is.character (файл)) {: условие имеет длину> 1, и будет использоваться только первый элемент "error. Не знаю, почему это неожиданно появилось, когда оно сработало до ... – user2726449

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