2013-03-28 9 views
5

Jestem użytkownikiem Staty próbującym się uczyć R. Mam kilka długich ścieżek folderów, które w moim kodzie Staty zapisałem jako locals. Mam wiele plików w obu tych folderach do wykorzystania w mojej analizie. Wiem, że w R mogę zmienić katalog roboczy za każdym razem, gdy chcę odwołać się do pliku w jednym z folderów, ale zdecydowanie nie jest to dobry sposób na zrobienie tego. Nawet jeśli przechowuję ścieżki folderów jako łańcuchy w R, nie mogę wymyślić jak się do nich odnosić (np. Używając `folder1 'w Stata). Zastanawiam się, czy próba przepisania linii kodu Staty po linii w R nie jest najlepszym sposobem na nauczenie się. Czy ktoś może pomóc?R Odpowiednik lokalnych lub globalnych makr Stata

+0

Myślę, że szukasz 'list.files (.)'. Zobacz [** tutaj **] (http://stackoverflow.com/questions/5758084/loop-in-r-loading-files/5758134#5758134). Sprawdź także '? List.files' dla wszystkich możliwych opcji. – Arun

+1

"Nawet jeśli przechowuję ścieżki folderów jako ciągi w R, nie mogę wymyślić jak się do nich odwoływać (np. Używając' folder1 'w Stacie). " Czy możesz podać konkretny przykład tego problemu z kodem? – joran

+0

@joran folder1 to nazwa zmiennej. Otaczenie go backtick/tick rozwiązuje nazwę i zwraca wartość. Myślenie o Stacie da mi koszmary nocne ... –

Odpowiedz

6

Po pierwsze, jako dawny użytkownik Stata, pozwól mi polecić R for Stata Users. Istnieje również ten artykuł na Macros in R. Myślę, że @Nick Cox ma rację, że musisz nauczyć się robić rzeczy w bardziej odmienny sposób. Ale podobnie jak ty (przynajmniej w tym przypadku), często zaczynam od nowego zadania z moją wcześniejszą wiedzą, jak to zrobić w Stacie i od tego miejsca. Czasami stwierdzam, że podejścia są podobne. Czasami mogę sprawić, by R działał jak Stata, gdy inne podejście byłoby lepsze (np. loops vs. vectorization).

Nie jestem pewien, czy zdobędę Twoje pytanie z następującymi słowami, ale pozwól mi spróbować.

W Stata, byłoby wspólne napisać:

global mydata "path to my data directory/" 

Aby zaimportować dane, chciałbym po prostu wpisać:

insheet using "${mydata}myfile.csv" 

jako dawny użytkownik Stata, chcę zrobić coś podobnego w R. Oto, co robię:

mydata <- "path to my data directory/" 

Aby zaimportować plik csv znajdujący się w tym katalogu i utworzyć ramkę danych led myfile, użyłbym:

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

lub bardziej wydajnie ...

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

Nie jestem jeszcze zbyt skutecznym użytkownikiem R, więc może inni zauważą pewne niedociągnięcia w tym podejściu.

+1

Stata wywołuje pobieranie nazwanego ciągu znaków (tj. Wektora znaku) jako "makro"? –

+1

Jest to przykład użycia globalnego makra. zobacz [tutaj] (http://data.princeton.edu/stata/programming.aspx). Istnieje wiele bardziej interesujących zastosowań. –

+1

Ah. Mam wrażenie, że R używa struktur list bardziej niż Stata. Istnieje funkcja, którą widziałem głównie w grafice sieciowej o nazwie 'modifyList', która może pozwolić na podobne zastosowania. Są również wyrażenia i funkcja "podstawiania" w domenie manipulacji językiem, która może być potrzebna do uzyskania czegoś podobnego do tej funkcji. Wygląda na to, że Stata zakłada, że ​​otrzyma uporządkowane argumenty tekstowe bez tak wielu separatorów, podczas gdy R ma większy stopień oddzielenia wektorów znakowych od rzeczywistych elementów językowych. –

5

Może chcesz file.path()?

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

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

Można owinąć source lub read.XXX lub cokolwiek innego wokół tego robić, co chcesz.

+0

Dzięki @Chase. To odpowiada na moje pytanie. – user2012406

+0

@ user2012406 Cieszę się, że dostałeś odpowiedź, która rozwiązała twój problem! Pomaga to poprawić jakość witryny, jeśli zaznaczysz to, klikając znacznik wyboru odpowiedzi, która rozwiązała Twój problem. (Nigdy nie jesteś zobowiązany do tego, ale pomaga to zasygnalizować innym, że odpowiedź rzeczywiście rozwiązała twój problem.) – joran

+0

@joran Przepraszam za to. Dołączyłem do Stack Overflow kilka dni temu. Używam go i wyłączam, kiedy pojawiło się w moich wynikach wyszukiwania podczas pracy nad danymi, ale nigdy nie miałem konta do tej pory. Nadal nie mam wystarczającej reputacji, aby głosować lub cokolwiek zgodzić. Będę pamiętać, aby ponownie przeanalizować te odpowiedzi, aby uzyskać upomnienie, gdy będę potrzebować reputacji. – user2012406

1

Zgaduję z kontekstu, że termin "lokalny" po zastosowaniu do plików oznacza, że ​​zostały załadowane do pamięci dla celów wydajnościowych? Jeśli tak, to musisz zdać sobie sprawę, że prawie wszystkie zwykłe obiekty R są obsługiwane w ten sposób. Zobacz ?read.table i ?load. Jedynym sposobem, w jaki dane mogą pozostać nielokalne, jest umieszczenie ich w bazie danych zawierającej pakiet interfejsu obsługujący zapytania SQL lub wykorzystujący wyspecjalizowane pakiety, takie jak ff lub bycol.

Poza tym i pomysłem Chase'a na użycie file.path(), każde odniesienie do plików lub połączeń odbywa się za pomocą odpowiednich funkcji odczytu/ładowania/skanowania, do których wartości znaków podawane są jako (różnie nazywane) argumenty. Możesz zobaczyć różne funkcje niskiego poziomu z ?file i być może po kilku dodatkowych linkach z tej strony pomocy. Możesz przechowywać jeden lub więcej wyników konstrukcji file.path w wektorze znakowym, który może być nazwany dla łatwego odniesienia.

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

Przez lokalne, mam na myśli makro lokalne w Stata. Przykro mi, ale domyślam się, że nie było jasne z moim pytaniem. Wiem, jak załadować dane. Zastanawiam się, jak uniknąć powtarzania długich ścieżek plików, przechowując je jako małe "lokalne" i zamiast nich używać nazwy lokalnej. – user2012406

+0

To nie pomaga mi zrozumieć. Nie mogę zrozumieć, dlaczego wektor nazwanych postaci nie jest skutecznym sposobem dokumentowania i zapisywania ścieżek. –

Powiązane problemy