2013-06-10 18 views
23

Mam listę ramek danych i dały każdy element na liście (np każda ramka danych) nazwę:Korzystanie lapply zastosować funkcję na liście ramek danych i zapisywania danych wyjściowych do plików o różnych nazwach

na przykład

df1 <- data.frame(x = c(1:5), y = c(11:15)) 
df2 <- data.frame(x = c(1:5), y = c(11:15)) 
mylist <- list(A = df1, B = df2) 

Mam funkcję, którą chcę zastosować do każdej ramki danych; W tej funkcji chcę dołączyć wiersz do zapisywania wyników do pliku (ewentualnie chcę zrobić bardziej skomplikowane rzeczy, takie jak zapisywanie wykresów korelacji między dwiema zmiennymi dla każdej ramki danych, ale myślę, że zaczynam prosty)

na przykład

NewVar <- function(mydata, whichVar, i) { 
mydata$newVar <- mydata[, whichVar] + 1 
write.csv(mydata, file = i) 
} 

chcę użyć lapply() zastosować tę funkcję do każdej ramki danych w moim liście

coś takiego:

hh<-lapply(mylist, NewVar, whichVar = "y") 

nie mogę dowiedzieć się, jak przypisać „ja” w kontekście lapply, aby i iterowało nad nazwami na liście ramek danych, zapisując wiele plików o różnych nazwach (w tym przypadku dwóch plikach o nazwach A i B), które odpowiadają zmodyfikowanemu klatki ta.

+1

wiem powiedziałeś starasz się unikać za pomocą pętli for ale myślę, że w tym przypadku warto użyć pętli for. Nie lubię używać 'lapply()' jeśli nic nie jest zwracane. Coś w rodzaju 'l_ply()' z pakietu 'plyr' jest prawdopodobnie bardziej odpowiednie. Lub po prostu pętlę for. – MadScone

Odpowiedz

7

Będzie pracować z następującym lapply rozmowy:

lapply(names(mylist), function(x) NewVar(mylist[[x]], "y", x)) 
11

Istnieje wiele opcji. Na przykład:

lapply(names(mylist), 
     function(x)write.csv(mylist[x], 
           file =paste0(x,'.csv'))) 

lub za pomocą indeksów:

lapply(seq_along(mylist), 
    function(i)write.csv(mylist[i], 
          file =paste0(names(mylist)[i],'.csv'))) 
+0

Dzięki za odpowiedź ... Jednak próbowałem obie te opcje i nie wydają się działać dla funkcji, która jest zdefiniowana poza lapply polecenia. Moja rzeczywista funkcja musi wykonać kilka analiz, a następnie zapisać wszystkie wyniki, więc nie ma możliwości zdefiniowania go w jednym wierszu. – user2414840

Powiązane problemy