2013-01-14 16 views
5

Jedną z najbardziej frustrujących cech R jest trudność w tworzeniu nowych zmiennych ramek danych za pomocą nazw, algorytmicznie i intuicyjnie.Tworzenie nowej nazwanej zmiennej w ramce danych za pomocą konwencji pętli i nazewnictwa

Załóżmy, że mam ramkę danych z niektórymi zmiennymi i chcę utworzyć nowe zmienne na ich podstawie w pętli. Na przykład, chcę tworzyć nowe zmienne, które są skumulowana suma istniejących zmiennych, i nazwał df$var_cumul

temp<-as.data.frame(cbind(seq(0:10),seq(10:20))) 
names(temp)<-c("x","y") 
for (i in 1:ncol(temp)) { 
    vname<-names(temp)[i] 
    assign(paste("temp$",vname,"_cumul",sep=""),cumsum(contrs[,i])) 
} 

Nie permuation tego Znalazłem prace. Jest to prawdopodobnie jeden z moich największych problemów z R na bieżąco.

Czy istnieje łatwy intuicyjny sposób na zrobienie tego?

+2

trzeba przestudiować stronę pomocy dla "[[" bardziej ostrożnie. Kluczem jest unikanie daremnego wysiłku, aby '$ <-' zrobić coś, czego nie może zrobić. Pomógłby też, gdybyś oduczył się obrzydliwości 'as.data.frame (cind (...))' –

+1

.. również nigdy nie używaj '1: ncol',' 1: nrow' lub '1: length'. .. (nie robi to, co myślisz, a takie przypadki są kłopotliwe w debugowaniu ...) - zamiast tego chcesz użyć 'seq_len()' i znajomych. –

+0

Z drugim punktem DWina, wierzę, że odnosi się on do faktu, że 'data.frame (x = 1:11, y = 1:11)' jest (między innymi) o wiele mniej pisaniem. Z poważaniem zalecałbym grę z efektami takimi jak 'seq (10:20)', ponieważ to też jest okropne. (Czytanie '? Seq' byłoby dobrym początkiem.) – joran

Odpowiedz

5

Tak, operator [[:

temp <- data.frame(x = 0:10, y = 10:20) 

for (n in names(temp)) 
    temp[[paste0(n, "_cumsum")]] <- cumsum(temp[[n]]) 
+0

Jeśli chcę utworzyć 3 ramkę danych, czy mogę utworzyć ją w pętli for ?, moja sprawa to dla (w 1: 3) { df.i <- data.frame (coś) } –

Powiązane problemy