2010-11-17 8 views
24

Pytanie to wszystko - chcę wziąć obiekt listy pełen data.frames i zapisać każdy plik data.frame w osobnym pliku .csv, gdzie nazwa Plik .csv odpowiada nazwie obiektu listy.Napisz listę data.frames, aby oddzielić pliki CSV z lapply

Oto powtarzalny przykład i kod, który napisałem do tej pory.

df <- data.frame(
    var1 = sample(1:10, 6, replace = TRUE) 
    , var2 = sample(LETTERS[1:2], 6, replace = TRUE) 
    , theday = c(1,1,2,2,3,3) 
) 

df.daily <- split(df, df$theday) #Split into separate days 

lapply(df.daily, function(x){write.table(x, file = paste(names(x), ".csv", sep = ""), row.names = FALSE, sep = ",")}) 

A oto top komunikatu o błędzie, że R wypluje

Error: Results must have one or more dimensions. 
In addition: Warning messages: 
1: In if (file == "") file <- stdout() else if (is.character(file)) { : 
    the condition has length > 1 and only the first element will be used 

Co ja tu brakuje?

+0

Duplikat http://stackoverflow.com/q/3411429/271616 –

+0

@Joshua - dar, wyszukiwanie Google nie powiedzie się. Powinienem już iść do domu. Zapraszam do zamknięcia tego. – Chase

+0

To nie jest dokładnie duplikat. Twój błąd mówi, że przekazujesz więcej niż jeden ciąg znaków do zapisania.tabeli jako nazwy pliku. names (x) zwraca wszystkie nazwy ramek danych. –

Odpowiedz

16

Spróbuj tego:

sapply(names(df.daily), 
function (x) write.table(df.daily[[x]], file=paste(x, "txt", sep=".")) ) 

Powinieneś zobaczyć nazwy ("1", "2", "3") wypluć jeden po drugim, ale null są dowody, że strona -efekt zapisu na pliki dyskowe został zakończony. (Edit: zmieniona [] do [[]]).

+0

Dzięki za rozwiązanie bazowe R i bardziej zwięzły sposób użycia 'wklejania' . – Chase

+0

Myślę, że powinno być 'df.daily [[x]]'. – Marek

+0

Zarówno df.daily [x], jak i df.daily [[x]] dają ten sam wynik na moim komputerze. Sądzę jednak, że widzę logikę twojego podejrzenia. –

5

Kilka rzeczy:

laply wykonuje operacje na liście. To, czego szukasz, to d_ply. I nie musisz tego robić dzień po dniu, możesz pozwolić, aby plyr zrobił to za Ciebie. Ponadto nie użyłbym nazw (x), ponieważ zwraca wszystkie nazwy kolumn elementu data.frame.

d_ply(df, .(theday), function(x) write.csv(x, file=paste(x$theday,".csv",sep=""),row.names=F)) 
+0

Zawsze z jakiegoś powodu zapominam o funkcjach "_" plyr. To wystarczy. Dzięki! – Chase

+0

to rozwiązanie nie działa dla mnie. Otrzymuję komunikat o błędzie w następujący sposób: Błąd w pliku (file, ifelse (append, "a", "w")): nieprawidłowy argument "opis" Ponadto: Komunikat ostrzegawczy: W przypadku, gdy (plik == "") file <- stdout() else if (is.character (file)) {: warunek ma długość> 1 i zostanie użyty tylko pierwszy element – zach