прочитать файл .csv с неизвестным путем R

Я знаю, что это может быть очень глупый вопрос, но я потратил на это несколько часов.

хочу прочитать файл .csv, у которого нет полного пути (*/*data.csv). Я знаю, что следующий путь получит путь к текущему каталогу, но не знаю, как его адаптировать.

Marks <- read.csv(dir(path = '.', full.names=T, pattern='^data.*\\.csv'))

пробовал и этот, но не работает

Marks <- read.csv(file = "*/*/data.csv", sep = ",", header=FALSE))

Я не могу определить конкретный путь, так как он будет использоваться на разных машинах с разными путями, но я уверен в подпапках основного каталога, поскольку они являются результатом сценария bash.

и я планирую вызвать это из Unix, который определяет рабочее пространство

моя структура данных

lecture01/test/data.csv
lecture02/test/data.csv
lecture03/test/data.csv

person V-V    schedule 26.02.2013    source источник
comment
Предположительно вы на Linux/unix?   -  person Ricardo Saporta    schedule 27.02.2013
comment
stackoverflow.com/questions/12324539/   -  person Ben Bolker    schedule 27.02.2013
comment
@Ricardo Saporta: у меня есть и Windows, и Linux   -  person V-V    schedule 27.02.2013
comment
Ваш файл CSV всегда находится в подкаталоге текущего рабочего каталога?   -  person Carl Witthoft    schedule 27.02.2013
comment
@Carl Witthoft: да ... у меня есть несколько папок с лекциями, в каждой есть папка Marks, содержащая файлы data.csv   -  person V-V    schedule 27.02.2013
comment
@Ben Bolker, но это не учитывает setwd, который у меня уже есть, и возвращает файл в каталоге по умолчанию ... я хочу получить только те, которые находятся в подпапках этой конкретной папки   -  person V-V    schedule 27.02.2013
comment
Этот вопрос меня очень смущает. Если код будет запускаться на разных компьютерах, но в ситуациях, когда setwd уже был запущен, то простой запуск read.csv("subfolder/data.csv") приведет вас в нужное место независимо от того, на какой машине вы находитесь. Я не понимаю, в чем проблема.   -  person joran    schedule 27.02.2013
comment
@joran: Я хочу создать цикл вокруг itlate, чтобы читать их один за другим для выполнения дополнительных действий ... обучение шаг за шагом .. У меня есть несколько папок с одинаковой структурой, я хочу иметь возможность читать внутренние подпапки .. , мои файлы такие (lecture01/marks/data.csv, Lecture02/marks/data.csv, Lection03/marks/data.csv)   -  person V-V    schedule 27.02.2013
comment
Извините, но это все еще не имеет для меня абсолютно никакого смысла. Я до сих пор не вижу четкого изложения конкретной проблемы, только некоторые расплывчатые ссылки на чтение CSV и имен путей.   -  person joran    schedule 27.02.2013


Ответы (2)


Ваши комментарии, хотя в настоящее время и не являются вашим вопросом, указывают на то, что вы ожидаете запустить свой код в рабочем каталоге, который содержит некоторое количество подкаталогов (lecture01, Lection02 и т. д.), каждый из которых содержит подкаталог «метки», который, в свою очередь, содержит файл data.csv. Если это так, и ваша цель — прочитать csv из каждого подкаталога, то у вас есть несколько вариантов в зависимости от оставшихся деталей.

Случай 1. Укажите имена каталогов верхнего уровня напрямую, если вы знаете их все и они потенциально уникальны:

dirs <- c("lecture01", "lecture02", "some_other_dir")
paths <- file.path(dirs, "marks/data.csv")

Случай 2. Создайте имена каталогов верхнего уровня, например если все они начинаются с «лекции», за которой следует двузначное число, и вы можете (или специально хотите) указать числовой диапазон, например. 01 по 15:

dirs <- sprintf("lecture%02s", 1:15)
paths <- file.path(dirs, "marks/data.csv")

Случай 3. Определите имена каталогов верхнего уровня, сопоставив шаблон, например если вы хотите читать данные из каждого каталога, начиная со строки «лекция»:

matched.names <- list.files(".", pattern="^lecture")
dirs <- matched.names[file.info(matched.names)$isdir]
paths <- file.path(dirs, "marks/data.csv")

Если у вас есть вектор путей, я бы, вероятно, использовал lapply для чтения данных в список для дальнейшей обработки, называя каждый из них именем базового каталога:

csv.data <- lapply(paths, read.csv)
names(csv.data) <- dirs

В качестве альтернативы, если любая обработка, которую вы выполняете для каждого отдельного CSV, выполняется только для побочных эффектов, таких как изменение данных и запись новой версии, и особенно если вы никогда не хотите, чтобы все они были в памяти одновременно раз, затем используйте цикл.

Если этот ответ не соответствует действительности, даже если это не так, было бы здорово, если бы вы могли уточнить вопрос соответствующим образом.

person regetz    schedule 27.02.2013
comment
Большое спасибо ... Я могу задать неправильный вопрос, поскольку я просто пытаюсь что-то узнать ... проверьте ссылку ... это может дать вам лучшее представление о том, чего я пытаюсь достичь, и почему я, хотя это хорошо, чтобы прочитать файл ... ссылка - person V-V; 27.02.2013
comment
в чем причина наличия 'dirs ‹-matched.names[file.info(matched.names)$isdir]'? потому что работает и без него - person V-V; 27.02.2013
comment
matched.names будет включать имена любых каталогов и файлов, соответствующих шаблону list.files. Это может быть проблемой, если, например, в вашем рабочем каталоге также есть файл с именем «lection_notes.txt». Следующая строка извлекает только имена каталогов. Похоже, это (в настоящее время) не нужно для вас, но я бы все равно оставил его в качестве защитной практики программирования. - person regetz; 27.02.2013

У меня нет кода, но я бы сделал затворнический глобус из корня и выполнил бы preg_match, чтобы найти файл .csv (используйте фигурную скобку).

person Loren Wolsiffer    schedule 27.02.2013