Jak utworzyć listę ramek danych i jak uzyskać dostęp do każdej z tych ramek danych z listy?
Na przykład, jak mogę umieścić te ramki danych na liście?
d1 <- data.frame(y1 = c(1, 2, 3),
y2 = c(4, 5, 6))
d2 <- data.frame(y1 = c(3, 2, 1),
y2 = c(6, 5, 4))
=
nie używaj w<-
środkudata.frame()
. Używając<-
tworzeniay1
iy2
w swoim globalnym środowisku, twoja ramka danych nie jest taka, jak chcesz.<-
is wewnątrz data.frame (). Co za nowość.Odpowiedzi:
Nie ma to związku z twoim pytaniem, ale chcesz go używać,
=
a nie<-
w wywołaniu funkcji. Jeśli go użyjesz<-
, skończysz na tworzeniu zmiennychy1
iy2
niezależnie od środowiska, w którym pracujesz:To nie będzie miało pozornie pożądanego efektu tworzenia nazw kolumn w ramce danych:
Z
=
drugiej strony operator powiąże Twoje wektory z argumentamidata.frame
.Jeśli chodzi o twoje pytanie, utworzenie listy ramek danych jest łatwe:
Dostęp do ramek danych uzyskuje się tak samo, jak do dowolnego innego elementu listy:
źródło
Pozostałe odpowiedzi pokazać wam jak zrobić listę data.frames kiedy już kilka data.frames, np
d1
,d2
.... Mając nazwanych kolejno ramek danych jest problemem, a umieszczenie ich w wykazie jest to dobra poprawka, ale najlepszą praktyką jest unikanie posiadania wiązki danych. ramek nie ma na liście .Inne odpowiedzi podają wiele szczegółów na temat przypisywania ramek danych elementom listy, uzyskiwania do nich dostępu itp. Omówimy to trochę tutaj, ale głównym punktem jest to, że nie czekaj, aż będziesz miał sporo
data.frames
aby dodać je do listy. Zacznij od listy.Pozostała część tej odpowiedzi obejmie niektóre typowe przypadki, w których możesz ulec pokusie, aby utworzyć sekwencyjne zmienne i pokazać, jak przejść bezpośrednio do list. Jeśli dopiero zaczynasz korzystać z list w R, możesz także przeczytać Jaka jest różnica między dostępem do elementów listy
[[
a[
dostępem do nich? .Listy od początku
Nigdy nie twórz
d1
d2
d3
... ...dn
w pierwszej kolejności. Utwórz listęd
zn
elementami.Odczytywanie wielu plików do listy ramek danych
Odbywa się to dość łatwo podczas wczytywania plików. Może masz pliki
data1.csv, data2.csv, ...
w katalogu. Twoim celem jest lista nazwanych data.framesmydata
. Pierwszą rzeczą, której potrzebujesz, jest wektor ze wszystkimi nazwami plików. Można skonstruować ten pastą (npmy_files = paste0("data", 1:5, ".csv")
), ale to chyba łatwiejsze w użyciulist.files
, aby pobrać wszystkie odpowiednie pliki:my_files <- list.files(pattern = "\\.csv$")
. Możesz użyć wyrażeń regularnych, aby dopasować pliki, przeczytaj więcej o wyrażeniach regularnych w innych pytaniach, jeśli potrzebujesz pomocy. W ten sposób możesz pobrać wszystkie pliki CSV, nawet jeśli nie są zgodne z dobrym schematem nazewnictwa. Lub możesz użyć bardziej wyszukanego wzorca wyrażenia regularnego, jeśli chcesz wybrać niektóre pliki CSV z kilku z nich.W tym momencie większość początkujących R używa
for
pętli i nie ma w tym nic złego, działa dobrze.Bardziej podobny do R sposób to zrobić
lapply
, co jest skrótem do powyższegoOczywiście zastąp odpowiednio inną funkcję importu danych
read.csv
.readr::read_csv
lubdata.table::fread
będzie szybszy, lub możesz potrzebować innej funkcji dla innego typu pliku.Tak czy inaczej, warto nazwać elementy listy, aby pasowały do plików
Dzielenie ramki danych na listę ramek danych
Jest to bardzo łatwe, funkcja podstawowa
split()
robi to za Ciebie. Możesz dzielić według kolumny (lub kolumn) danych lub według dowolnej innej opcjiJest to również dobry sposób na rozbicie ramki danych na części w celu weryfikacji krzyżowej. Może chcesz podzielić się
mtcars
na części szkoleniowe, testowe i weryfikacyjne.Symulowanie listy ramek danych
Może symulujesz dane, coś takiego:
Ale kto wykonuje tylko jedną symulację? Chcesz to zrobić 100 razy, 1000 razy, więcej! Ale nie chcesz 10 000 ramek danych w swoim obszarze roboczym. Użyj
replicate
i umieść je na liście:W tym przypadku szczególnie powinieneś rozważyć, czy naprawdę potrzebujesz osobnych ramek danych, czy też pojedyncza ramka danych z kolumną „grupową” równie dobrze by działała? Używanie
data.table
lubdplyr
dość łatwo jest robić rzeczy „grupowo” w ramce danych.Nie umieściłem moich danych na liście :( Będę następnym razem, ale co mogę teraz zrobić?
Jeśli są dziwnym asortymentem (co jest niezwykłe), możesz po prostu przypisać im:
Jeśli masz ramek danych nazwanych we wzór, na przykład
df1
,df2
,df3
, i chcesz je na liście, możnaget
je, jeśli możesz napisać wyrażenie regularne pasujące nazwy. Coś jakZasadniczo
mget
służy do pobierania wielu obiektów i zwracania ich na nazwaną listę. Jego odpowiednikget
służy do pobrania pojedynczego obiektu i zwrócenia go (nie na liście).Łączenie listy ramek danych w jedną ramkę danych
Częstym zadaniem jest łączenie listy ramek danych w jedną dużą ramkę danych. Jeśli chcesz je ułożyć jeden na drugim, użyj ich
rbind
dla pary, ale dla listy ramek danych są trzy dobre opcje:(Podobnie przy użyciu
cbind
lubdplyr::bind_cols
dla kolumn.)Aby scalić (dołączyć) listę ramek danych, możesz zobaczyć te odpowiedzi . Często chodzi o to, aby korzystać
Reduce
zmerge
(lub innej funkcji łączącej), aby je ze sobą.Po co umieszczać dane na liście?
Umieścić podobne dane w listach, bo chcesz robić podobne rzeczy do każdej ramki danych, a funkcje takie jak
lapply
,sapply
do.call
, opakowanie , a stare funkcje sprawiają, że łatwo to zrobić. Przykłady osób, które łatwo robią rzeczy z listami, są na SO.purrr
plyr
l*ply
Nawet jeśli używasz mało używanej pętli for, o wiele łatwiej jest zapętlać elementy listy niż konstruować nazwy zmiennych
paste
i uzyskiwać do nich dostępget
. Łatwiej też debugować.Pomyśl o skalowalności . Jeśli naprawdę potrzebujesz tylko trzy zmienne, w porządku do użytku
d1
,d2
,d3
. Ale jeśli okaże się, że naprawdę potrzebujesz 6, to dużo więcej pisania. Następnym razem, gdy będziesz potrzebować 10 lub 20, przekonasz się, że kopiujesz i wklejasz linie kodu, być może używasz funkcji znajdź / zamień, aby zmienićd14
nad15
, i myślisz, że nie tak powinno być programowanie . Jeśli używasz listy, różnica między 3 przypadkami, 30 przypadkami i 300 przypadkami wynosi co najwyżej jeden wiersz kodu --- bez zmian, jeśli liczba spraw jest automatycznie wykrywana np. Przez liczbę.csv
plików w twoim informator.Możesz nazwać elementy listy, na wypadek gdybyś chciał użyć czegoś innego niż indeksy numeryczne, aby uzyskać dostęp do swoich ramek danych (i możesz użyć obu, nie jest to wybór XOR).
Ogólnie rzecz biorąc, używanie list doprowadzi Cię do napisania czystszego, łatwiejszego do odczytania kodu, co spowoduje mniej błędów i mniej zamieszania.
źródło
r
ilist
.my_data <- NULL
zamiast „my_data <- list () '! :)my_data <- list()
wyjaśnia, że tworzysz listę, co jest dobre! Wyczyść kod to dobra rzecz. Nie widzę żadnej korzyści z używaniamy_data <- NULL
zamiast tego.names(my_data) <- gsub("\\.csv$", "", my_files)
;) <br> Ale szanuję twoje rady, ponieważ dużo się od nich uczę jako początkujący i naprawdę to doceniam :)Możesz również uzyskać dostęp do określonych kolumn i wartości w każdym elemencie listy za pomocą
[
i[[
. Oto kilka przykładów. Po pierwsze, możemy uzyskać dostęp tylko do pierwszej kolumny każdej ramki danych na liście za pomocąlapply(ldf, "[", 1)
, gdzie1
oznacza numer kolumny.Podobnie możemy uzyskać dostęp do pierwszej wartości w drugiej kolumnie za pomocą
Następnie możemy również uzyskać dostęp do wartości kolumn bezpośrednio, jako wektor, za pomocą
[[
źródło
Jeśli masz dużą liczbę ramek danych o kolejnych nazwach, możesz utworzyć listę żądanego podzbioru ramek danych w następujący sposób:
gdzie
my.list2
zwraca listę zawierającą 2., 3. i 4. ramkę danych.Należy jednak pamiętać, że ramki danych z powyższej listy nie są już nazywane. Jeśli chcesz utworzyć listę zawierającą podzbiór ramek danych i zachować ich nazwy, możesz spróbować:
który zwraca:
źródło
lapply(foo, get)
użyjmget(foo)
Biorąc pod uwagę, że masz „dużą” liczbę ramek danych o podobnych nazwach (tutaj d #, gdzie # to pewna dodatnia liczba całkowita), poniżej jest niewielka poprawa metody @ mark-millera. Jest bardziej zwięzły i zwraca nazwaną listę data.frame, gdzie każda nazwa na liście jest nazwą odpowiedniego oryginalnego data.frame.
Klucz używa
mget
razem zls
. Jeśli ramki danych d1 i d2 podane w pytaniu były jedynymi obiektami o nazwach d # w środowisku, toktóre wróci
Ta metoda wykorzystuje argument wzorca w
ls
, który pozwala nam używać wyrażeń regularnych do dokładniejszej analizy nazw obiektów w środowisku. Alternatywą dla wyrażenia regularnego"^d[0-9]+$"
jest"^d\\d+$"
.Jak wskazuje @gregor , ogólnie lepiej jest skonfigurować proces konstruowania danych, aby data.frame były umieszczane na nazwanych listach na początku.
dane
źródło
To może być trochę późno, ale wracając do twojego przykładu, pomyślałem, że odrobinę przedłużę odpowiedź.
Następnie łatwo tworzysz listę:
Teraz masz listę, ale zamiast uzyskiwać do niej dostęp w stary sposób, taki jak
możesz użyć tej funkcji, aby uzyskać i przypisać wybraną ramkę danych.
Teraz zdobądź ten, który chcesz.
Mam nadzieję, że ten dodatkowy kawałek pomaga.
Twoje zdrowie!
źródło
GETDF_FROMLIST(mylist, 1)
sięmylist[[1]]
? Jeśli wolisz składnię funkcji, możesz to zrobić nawet"[["(mylist, 1)
bez definiowania funkcji niestandardowej.return(DF_LIST[[ITEM_LOC]])
, bez potrzeby przypisywania zmiennej pośredniej.Bardzo prosty ! Oto moja sugestia:
Jeśli chcesz wybrać ramki danych w swoim obszarze roboczym, spróbuj tego:
lub
wszystko to da ten sam rezultat.
Możesz zmienić,
is.data.frame
aby sprawdzić inne typy zmiennych, takie jakis.function
źródło
Uważam się za kompletnego nowicjusza, ale myślę, że mam niezwykle prostą odpowiedź na jedno z pierwotnych pytań, które nie zostały tutaj wymienione: dostęp do ramek danych lub ich części.
Zacznijmy od utworzenia listy z ramkami danych, jak wspomniano powyżej:
Następnie, jeśli chcesz uzyskać dostęp do określonej wartości w jednej z ramek danych, możesz to zrobić, używając kolejno podwójnych nawiasów. Pierwszy zestaw przenosi Cię do ramki danych, a drugi zestaw prowadzi do określonych współrzędnych:
źródło