2016-12-20 23 views
5

Próbuję utworzyć oddzielne pliki .csv dla każdej grupy w ramce danych zgrupowanej z funkcją group_by dplyra. Do tej pory mam coś w rodzaju:Jak mogę napisać grupy dplyr do oddzielnych plików?

by_cyl <- group_by(mtcars, cyl) 
do(by_cyl, write_csv(., "test.csv")) 

Zapisuje pojedynczy plik .csv zawierający tylko dane z ostatniej grupy. Jak mogę to zmodyfikować, aby zapisać wiele plików .csv, z których każdy ma nazwy plików, które zawierają cyl?

Odpowiedz

10

Możesz zawinąć proces zapisu CVV w niestandardowej funkcji w następujący sposób. Zauważ, że funkcja musi zwrócić się data.frame innego zwraca błąd Error: Results are not data frames at positions

To będzie powrót 3 plików csv nazwanych "mtcars_cyl_4.csv", "mtcars_cyl_6.csv" i "mtcars_cyl_8.csv"

customFun = function(DF) { 
write.csv(DF,paste0("mtcars_cyl_",unique(DF$cyl),".csv")) 
return(DF) 
} 

mtcars %>% 
group_by(cyl) %>% 
do(customFun(.)) 
+0

Dokładnie to, co potrzebne! Na marginesie - w moim przypadku zgrupowałem według dwóch zmiennych; okazuje się, że kolejność ich grupowania jest naprawdę ważna. Na przykład "cyl" musiałby być pierwszą grupą, która by działała. – Nat

+0

Piękne opakowanie funkcji! Dziękuję Ci! – spacedSparking

2

Jeśli chcesz korzystać z data.table, istnieje nieco mniej przylegający sposób robienia tego.

require(data.table) 
# Because this is a built in table we have to make a copy first 
mtcars <- mtcars 
setDT(mtcars) # convert the data into a data.table 

mtcars[, write.csv(.SD, paste0("mtcars_cyl_", .BY, ".csv")), by = cyl] 

Zauważ, że wynikowa tabela nie będzie mieć kolumnę cyl (co byłoby zbędne, ponieważ jest on przechowywany w nazwie pliku, ale może chcesz pozostawić ją w innych powodów).

Jeśli chcesz cyl zostać włączone wyjścia jako kolumny można użyć

mtcars[, write.csv(c(.BY,.SD), paste0("mtcars_cyl_", .BY, ".csv")), by=cyl] 
+0

Otrzymasz błąd, jeśli konwertujesz jeden z wbudowanych w tabelę na dane.tabeli bez uprzedniego skopiowania. Oto błąd, który można uzyskać "Błąd w setDT (mtcars): Nie można przekonwertować" mtcars "do data.table przez odwołanie, ponieważ powiązanie jest zablokowane.jest bardzo prawdopodobne, że" mtcars "znajduje się w pakiecie (lub środowisku), który jest zablokowane, aby zapobiec modyfikowaniu powiązań zmiennych Spróbuj skopiować obiekt do bieżącego środowiska, np: var <- copy (var), a następnie ponownie użyj setDT. " –

+0

Ups, dobrze, że jesteś. Mój zły –

+0

Dzięki za sugestie Rich. –

1

następujące prace (można pominąć funkcji niestandardowej)

library(dplyr) 
library(readr) 
group_by(mtcars, cyl) %>% 
    do(write_csv(., paste0(unique(.$cyl), "test.csv"))) 
+0

Otrzymuję to "Błąd: wyniki nie są ramkami danych na pozycjach: 1, 2, 3, 4, 5, 6, 7", podczas gdy odpowiedź @OdeToMyFiddle działa. – val