2009-10-25 11 views
5

ja przy użyciu pakietu R's stats i chciałby pętli column[x] w all the rows of a dataframe, działają na danych w each cell w kolumnie z funkcją i przechodzą wynik do nowej kolumny (z calculated result w new column wyrównane z danymi w column[x])Przelotowe kolumny w R

mam dwa problemy:

  1. nie mogę zmusić go do pracy
  2. zapętlenie wydaje się zniechęcać w R articles Przeczytałem. Czy istnieje alternatywne podejście, a jeśli nie, czy ktoś ma przykład, jak przeprowadzić pętlę?
+0

Czy możesz podać więcej szczegółów? Jak przykładowy problem, z którym pracujesz? – ariddell

+2

Zapętlanie niekoniecznie jest zniechęcane. Najpierw działaj, a dopiero potem pomyśl o tym, czy będzie szybciej. –

Odpowiedz

8

Bez żadnych przykładów trudno jest odpowiedzieć. Podstawowa sprawa to, co opisujesz, jest jednak to:

#Just a very simple data frame 
dat <- data.frame(x = c(1, 2, 3)) 
#Compute the squared value of each value in x 
dat$y <- dat$x^2 
#See the resultant data.frame, now with column y 
dat 

Kiedy mówisz R do kwadratu wektora (lub wektor, jak struktura, jak dat $ x), to wie, do kwadratu każdą wartość osobno . Nie musisz jawnie pętać tych wartości przez większość czasu - chociaż, jak zauważa Dirk, powinieneś tylko martwić się o optymalizację pętli, jeśli powodują one problemy. Powiedział, że z pewnością wolą czytanie i pisanie

dat$y <- dat$x^2 

do:

for(i in 1:length(dat$x)){ 
    dat$y[i] <- dat$x[i]^2 
} 

... gdzie to możliwe.

+0

Dzięki. Mogę sprawić, że arytmetyczna praca będzie w porządku. Nie mogę przekazać zawartości ramki danych do funkcji. Oto problem. Oto górnej części ramy (zwanych danych) z nagłówkiem „związek” i „uśmiecha” (uśmiechy są reprezentacją tekst cząsteczki) Compound_ID SMILES 12345 c1cccccc1 chcę użyć parse.smiles function() do czytaj w uśmiechach i wyprowadź cząsteczkę. Jeśli zrobię to na jednej cząsteczce, to OK (śmieci <- "c1ccccc1", parsuj.uśmiechy (śmieci) Jeśli robię sp <- get.smiles.parser() <śmieci - sapply (dane $ uśmiechy, parse.smiles, parser = sp) nie może zinterpretować uśmiechy – Andy

+0

Ok. Niestety nie bardzo wiedziałem, gdzie jesteś w R, więc pomyślałem, że po prostu wyrzucę tam podstawowy przypadek. "unknown" może to mieć - ale jeśli nie, najlepiej postawić mały zestaw danych próbki i funkcję. Trudno pojąć, co dzieje się źle z opisem, a ja, przynajmniej, nie mogę uzyskać żadnych * właściwych funkcji bez eksperymentowania. –

1

jeśli parse.smiles() jest funkcją chcesz zastosować do wszystkich wpis wektora „vec”, a następnie można użyć:

lapply(1:length(vec),parse.smiles(vec[i])) 
+2

Dziękuję wszystkim. Kolumna, w której byłem zainteresowany, została odczytana jako czynnik. Musiałem wyraźnie powiedzieć funkcji czytania w treści jako postaci i nie zdawałem sobie z tego sprawy dopóki nie wskazałem. Teraz działa. (i przepraszam za zniekształcony komentarz powyżej - został sformatowany ze zwrotami, które zniknęły po zaksięgowaniu) – Andy

1

Jedynym powodem pętli jest odradzane jest to, że powolny. R jest zaprojektowany do pracy na wektorach jednocześnie i ma wiele funkcji do osiągnięcia tego. Cała rodzina stosuje się, a także funkcje takie jak Vectorize, aby pomóc. Tak więc idiomem jest to, że jeśli używasz pętli, nie myślisz w R, ale czasami pętle naprawdę są odpowiednie.

Aby zrobić to w myśleniu R, należy wektoryzować swoją funkcję, jeśli nie jest ona wektoryzowana (patrz funkcja Wektoryzacja), a następnie wywołać tę funkcję z całą kolumną jako argumentem i przypisać ją do nowej kolumny.

f<-Vectorize(function(x,...),'x') 
data$newcolumn<-f(data[,1]) 

Zastosuj rodziny (zastosowanie, sapply, lapply, mapply, Tapply) również alternatywy. Większość natywnych funkcji R jest już wektoryzowana, ale zachowaj ostrożność podczas przekazywania dodatkowych argumentów, które mają być interpretowane jako wektory.