2013-03-28 1 views
5

Я пользователь Stata, пытающийся изучить R. У меня есть несколько длинных путей к папкам, которые в моем коде Stata хранятся как локальные. У меня есть несколько файлов в обеих папках для использования в моем анализе. Я знаю, что в R я могу изменить рабочий каталог каждый раз, когда хочу ссылаться на файл в одной из папок, но это определенно не очень хороший способ сделать это. Даже если я сохраню пути к папкам как строки в R, я не могу понять, как обращаться к ним (например, используя `folder1 'в Stata). Мне интересно, пытаться ли переписать код Stata по строкам в R, это не лучший способ узнать R. Может ли кто-то помочь?R эквивалент локальных или глобальных макросов Stata

+0

Я думаю, что вы ищете 'list.files (.)'. Посмотрите [** здесь **] (http://stackoverflow.com/questions/5758084/loop-in-r-loading-files/5758134#5758134). Также проверьте '? List.files' для всех возможных вариантов. – Arun

+1

«Даже если я сохраню пути к папкам в виде строк в R, я не могу понять, как обращаться к ним (например, использовать« folder1 »в Stata)». Можете ли вы привести конкретный пример этой проблемы с кодом? – joran

+0

@joran folder1 - это имя переменной. Окружающая его с backtick/tick решает имя и возвращает значение. Думать о Stata собирается дать мне кошмары ... –

ответ

6

Во-первых, как бывший пользователь Stata, позвольте мне рекомендовать R for Stata Users. Существует также эта статья на Macros in R. Я думаю, @Nick Cox прав, что вам нужно научиться делать что-то по-другому. Но, как и вы (по крайней мере, в этом случае), я часто начинаю новую задачу с моего предварительного знания о том, как это сделать в Stata и оттуда. Иногда я нахожу подходы похожими. Иногда я могу заставить R действовать как Stata, когда другой подход будет лучше (например, loops vs. vectorization).

Я не уверен, возьму ли я ваш вопрос со следующим, но позвольте мне попробовать.

В Stata, было бы принято писать:

global mydata "path to my data directory/" 

Чтобы импортировать данные, я бы просто наберите:

insheet using "${mydata}myfile.csv" 

Как бывший пользователь Stata, я хочу сделать что-то подобное in R. Вот что я делаю:

Чтобы импортировать файл csv, расположенный в этом каталоге, и создать кадр данных cal led myfile, я бы использовал:

myfile <- read.csv(paste(mydata, "myfile.csv", sep="")) 

или более эффективно ...

myfile <- read.csv(paste0(mydata, "myfile.csv")) 

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

+1

Stata вызывает поиск именованной строки (т. Е. Символьного вектора) a 'macro'? –

+1

Это пример использования глобального макроса. см. [здесь] (http://data.princeton.edu/stata/programming.aspx). Есть много более интересных применений. –

+1

Ах. Мое впечатление, что R использует структуры списков больше, чем Stata. Существует функция, которую я в основном видел в решетчатой ​​графике под названием «modifyList», которая может допускать подобные применения. Существуют также выражения и функция 'substitute' в области манипуляции языком, которая может потребоваться для получения чего-то подобного этой функции. Похоже, что Stata предполагает, что он получит упорядоченные текстовые аргументы без такого количества разделителей, в то время как R имеет большую степень разделения векторов символов от реальных языковых элементов. –

5

Возможно, вы хотите file.path()?

a <- "c:" 
b <- "users" 
c <- "charles" 
d <- "desktop" 

setwd(file.path(a,b,c,d)) 
getwd() 
#---- 
[1] "c:/users/charles/desktop" 

Вы можете обернуть source или read.XXX или что-то еще, что вокруг, чтобы делать то, что вы хотите.

+0

Спасибо @Chase. Это отвечает на мой вопрос. – user2012406

+0

@ user2012406 Я рад, что у вас есть ответ, который решил вашу проблему! Это помогает улучшить качество сайта, если вы укажете это, нажав галочку по ответу, который решил вашу проблему. (Вы никогда не обязаны это делать, но это помогает сигналу другим, которые на самом деле решали вашу проблему.) – joran

+0

@joran Извините. Я присоединился к Stack Overflow всего пару дней назад. Я использовал его и отключил, когда он появился в результатах поиска при работе над Stata, но до сих пор у меня не было учетной записи. У меня до сих пор нет достаточной репутации, чтобы продвигать или понижать все. Я запомню, чтобы вернуться к этим ответам, чтобы повысить их репутацию, когда мне нужна репутация. – user2012406

1

Я угадываю из контекста, что термин «местный» при применении к файлам означает, что они были загружены в память для повышения эффективности? Если это так, то вам нужно понять, что почти все обычные объекты R обрабатываются таким образом. См. ?read.table и ?load. Единственный способ, которым данные могут оставаться нелокальными, состоит в том, чтобы он находился в базе данных, которая имеет пакет интерфейса, который поддерживает SQL-запросы или использует специализированные пакеты, такие как ff или bycol.

Кроме того, и идея Chase использовать file.path(), любая ссылка на файлы или соединения выполняется с использованием надлежащих функций чтения/загрузки/сканирования, значениям символов которых присваиваются как (по-разному названные) аргументы. Вы можете увидеть множество низкоуровневых функций с ?file и, возможно, после некоторых дополнительных ссылок с этой страницы справки. Вы можете сохранить один или несколько результатов построения file.path в символьном векторе, который можно было бы назвать для удобства.

pathvecs <- c(User= "~/", hrtg="~/Documents/Heritage/") 
pathvecs 
#     User     hrtg 
#     "~/" "~/Documents/Heritage/" 
pathvecs["hrtg"] 
#     hrtg 
#"~/Documents/Heritage/" 
+0

По местному, я имею в виду макрос локальный в Stata. Мне жаль, но я догадываюсь, что не понял моего вопроса. Я знаю, как загрузить данные. Я выясняю, как избежать повторения длинных путей файлов, сохраняя их как небольшой «локальный» и вместо этого используя локальное имя. – user2012406

+0

Это не помогает мне понять. Я не могу понять, почему именованный символьный вектор не является эффективным способом документировать и хранить пути. –

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