2013-07-13 15 views
9

Załóżmy, że istnieje wiele ramek danych, które wymagają wykonania tej samej operacji. Na przykład:W jaki sposób R może przechodzić przez ramki danych?

prefix <- c("Mrs.","Mrs.","Mr","Dr.","Mrs.","Mr.","Mrs.","Ms","Ms","Mr") 
measure <- rnorm(10) 
df1 <- data.frame(prefix,measure) 
df1$gender[df1$prefix=="Mrs."] <- "F" 

Stworzyłby zmienną wskaźnikową o nazwie gender, gdy wartością w sąsiednim wierszu była "Mrs.". Ogólny sposób pętli nad zmiennych łańcuchowych w R został zaadaptowany z here z funkcją as.name() dodany do usunięcia cytaty z „ja”:

dflist <- c("df1","df2","df3","df4","df5") 

for (i in dflist) { 
    as.name(i)$gender[as.name(i)$prefix=="Ms."] <- "F" 
    } 

Niestety to nie działa. Jakieś sugestie?

Odpowiedz

8

Umieść wszystkie swoje ramki danych na liście, a następnie zapętlij/lapply nad nimi. Na dłuższą metę będzie ci łatwiej.

dfList <- list(df1=df1, df2=df2, ....) 

dfList <- lapply(dfList, function(df) { 
    df$gender[df$prefix == "Mrs."] <- "F" 
    df 
}) 

dfList$df1 
+0

dzięki, jak mogę wyodrębnić nowy ramki danych z listy dfList? –

+0

z 'dfList [[1]]', itp. Będę edytować post, aby pokazać, jak możesz je wydobywać z nazwami –

2

Pojedynczy przykład instancja nie będzie naprawdę utworzyć wskaźnik w zwykłym tego słowa znaczeniu, ponieważ nie- wartości „F” będzie <NA> a te nie działają dobrze w obrębie funkcji R. Zarówno operacje arytmetyczne, jak i operacje logiczne powrócą. Spróbuj zamiast tego:

df1$gender <- ifelse(prefix %in% c("Mrs.", "Ms") , "probably F", 
       ifelse(prefix=="Dr.", "possibly F", # as is my wife. 
             "probably not F")) 

Następnie postępuj zgodnie z @ Porady HongDoi do korzystania z list. I nie zapomnij o a) zwrocie pełnego obiektu ramek danych i b) przypisać wynik do nazwy obiektu (oba zostały zilustrowane, ale często zapomniane przez R-newb.)

Powiązane problemy