Hver gang jeg vil gjøre noe som er morsomt i R. prøver jeg vanligvis å bruke en funksjon i søkefamilien. (Sidespørsmål: Jeg har fortsatt ikke lært plyr eller reshape - ville plyr eller reshape erstatte alle disse helt) Men jeg har aldri helt forstått forskjellene mellom dem, hvordan bruker funksjonen til inngangsgruppert inngang, hvilken utgang vil se ut, eller selv hva inngangen kan være, så jeg går ofte bare gjennom dem alle til jeg får det jeg vil ha. Kan noen forklare hvordan du bruker hvilken som er når min nåværende (sannsynligvis feilaktige) forståelse er. sapply (vec, f). input er en vektor. utdata er en vektormatrix, hvor elementet jeg er f (veci) gir deg en matrise hvis f har en multi-element-utgangslapsel (vec, f). samme som sapply. men utdata er en liste gjelder (matrise, 12, f). Inndata er en matrise. utdata er en vektor, hvor elementet jeg er f (rowcol i av matrisen) tapply (vektor, gruppering, f). utdata er en matrixradius, hvor et element i matrisarrayen er verdien av f ved en gruppering g av vektoren, og g blir presset til radkolnavnene ved (dataframe, gruppering, f). la g være en gruppering. bruk f til hver kolonne i gruppen dataframe. Skriv ut grupperingen og verdien av f i hver kolonne. aggregat (matrise, gruppering, f). ligner på. men i stedet for å skrive ut utskriften, legger aggregatet alt i en dataframe. spurte Aug 17 10 kl 18:31 R har mange applikasjonsfunksjoner som er omtalt beskrevet i hjelpefilene (f. eks. gjelder). Det er nok av dem, men det begynner å bruke. Det kan være vanskelig å bestemme hvilken som passer for deres situasjon eller til og med å huske dem alle. De kan ha en generell følelse av at jeg skal bruke en applikasjonsfunksjon her, men det kan være vanskelig å holde dem alle rett i begynnelsen. Til tross for det faktum (bemerket i andre svar) er mye av funksjonen til den aktuelle familien dekket av den ekstremt populære plyr-pakken, er basisfunksjonene fortsatt nyttige og verdt å vite. Dette svaret er ment å fungere som en slags skilt for ny bruk, for å hjelpe dem med å rette riktig funksjon for deres spesielle problem. Merk at dette ikke er ment å bare regurgitate eller erstatte R dokumentasjonen. Håpet er at dette svaret hjelper deg med å bestemme hvilken applikasjonsfunksjon som passer din situasjon, og så er det opp til deg å undersøke det videre. Med ett unntak vil ikke ytelsesforskjeller behandles. gjelder - Når du vil bruke en funksjon til radene eller kolonnene i en matrise (og høyere dimensjonale analoger), er det ikke generelt tilrådelig for datarammer som det vil samle seg til en matrise først. Hvis du vil ha radkolonne betyr eller summer for en 2D-matrise, må du undersøke de svært optimaliserte lynraskene. rowMeans. colSums. rowSums. lapply - Når du vil bruke en funksjon til hvert element i en liste igjen, og få en liste tilbake. Dette er arbeidshestet til mange av de andre søkefunksjonene. Skal koden tilbake, og du vil ofte finne laplig under. sapply - Når du vil bruke en funksjon til hvert element i en liste i sin tur, men du vil ha en vektor tilbake, snarere enn en liste. Hvis du finner deg selv å skrive unlist (lapply (.)). stopp og vurder sapply. I mer avanserte bruksområder vil det forsøke å tvinge resultatet til et flerdimensjonalt utvalg, hvis det er aktuelt. For eksempel, hvis vår funksjon returnerer vektorer av samme lengde, vil sapply bruke dem som kolonner av en matrise: Hvis vår funksjon returnerer en 2-dimensjonal matrise, vil sapply gjøre det samme, og behandle hver returnert matrise som en enkelt lang vektor: Med mindre vi spesifiserer forenkle array. I så fall vil den bruke de enkelte matriser til å bygge et flerdimensjonalt utvalg: Hver av disse atferdene er selvsagt betinget av vår funksjon som returnerer vektorer eller matriser av samme lengde eller dimensjon. Vapply - Når du vil bruke sapply, men kanskje trenger å presse litt mer fart ut av koden din. For vapply. du gir i utgangspunktet R et eksempel på hva slags ting funksjonen din kommer tilbake, noe som kan spare tid til å tvinge tilbake verdier for å passe inn i en enkelt atomvektor. mapply - For når du har flere datastrukturer (for eksempel vektorer, lister) og du vil bruke en funksjon til de første elementene av hver, og deretter de andre elementene av hver, etc., tvinge resultatet til en vektorradius som i sapply. Dette er multivariat i den forstand at funksjonen din må godta flere argumenter. Kart - En wrapper for å mapply med SIMPLIFY FALSE. så det er garantert å returnere en liste. rapply - For når du vil bruke en funksjon til hvert element i en nestet listestruktur, rekursivt. For å gi deg en ide om hvor uvanlig rapply er, glemte jeg det når jeg først sendte dette svaret. Åpenbart, jeg er sikker på at mange bruker det, men YMMV. rapply er best illustrert med en brukerdefinert funksjon som skal brukes: tapply - For når du vil bruke en funksjon til delsett av en vektor, og delsettene er definert av en annen vektor, vanligvis en faktor. Den svarte sauen av den aktuelle familien, av sorter. Hjelpefilene bruker setningen ragged array kan være litt forvirrende. men det er faktisk ganske enkelt. En faktor (av samme lengde) som definerer grupper: Legg opp verdiene i x i hver undergruppe definert av y: Flere komplekse eksempler kan håndteres der undergruppene er definert av de unike kombinasjonene av en liste over flere faktorer. tapply er lik i ånd til splitt-søk-kombinere funksjoner som er vanlige i R (aggregat. by. ave. ddply etc.) Derfor er den svarte fårstatusen. Jsanders - Jeg ville ikke enig med det i det hele tatt. data. frame s er en helt sentral del av R, og som et listobjekt blir ofte manipulert med bruk av spesielt laply. De fungerer også som beholdere for å gruppere vektorerfaktorer av mange typer sammen i et tradisjonelt rektangulært datasett. Mens data. table og plyr kan legge til en viss type syntaks at noen kan finne mer komfortable, strekker de seg ut og virker på henholdsvis data. frame s. ndash thelatemail Aug 20 14 kl 6:08 På sidenotatet, her er hvordan de forskjellige plyrfunksjonene tilsvarer basen gjelder funksjoner (fra intro til plyr dokument fra plyr nettsiden had. co. nzplyr) Et av målene med plyr er å gi konsekvente navngivningskonvensjoner for hver av funksjonene, som koder inngangs - og utdata-datatyper i funksjonsnavnet. Det gir også konsistens i utgang, ved at utdata fra dlply () er lett tilpasbar til ldply () for å produsere nyttig utgang, etc. Konceptuelt er læringsplyr ikke vanskeligere enn å forstå basen på funksjonene. plyr og reshape funksjoner har erstattet nesten alle disse funksjonene i min hverdagsbruk. Men også fra Intro til Plyr-dokumentet: Beslektede funksjoner tapply og feie har ingen tilsvarende funksjon i plyr. og forbli nyttig. flette er nyttig for å kombinere oppsummeringer med de opprinnelige dataene. Først begynn med Jorans utmerket svar - tvilsomt, noe kan bedre det. Deretter kan følgende mnemonics bidra til å huske forskjellene mellom hver. Mens noen er åpenbare, kan andre være mindre så --- for disse finner du begrunnelse i Jorans diskusjoner. Lapply er en liste som gjelder som fungerer på en liste eller vektor og returnerer en liste. spply er en enkel laply (funksjon som standard for å returnere en vektor eller matrise når det er mulig) vapply er et verifisert søk (lar gjenstandsobjekttype bli forhåndsdefinert) rapply er en rekursiv søknad for nestede lister, dvs. lister i lister tapply er en merket søknad hvor kodene identifiserer delsettene som gjelder, er generisk. bruker en funksjon til en matrises rader eller kolonner (eller mer generelt til dimensjoner av en matrise). Oppbygg den riktige bakgrunnen Hvis du bruker den aktuelle familien, føles det fortsatt litt fremmed for deg, så kan det være at du mangler et nøkkelperspektiv . Disse to artiklene kan hjelpe. De gir den nødvendige bakgrunnen for å motivere de funksjonelle programmeringsteknikkene som tilbys av den anvendte funksjonsfamilien. Brukere av Lisp vil umiddelbart anerkjenne paradigmet. Hvis du ikke er kjent med Lisp, når du får hodet rundt FP, har du fått et kraftig synspunkt for bruk i R - og søknaden vil gi mye mer mening. svarte 25. april klokken 14:20 Siden jeg innså at de (de aller beste) svarene på dette innlegget manglet av og aggregerte forklaringer. Her er mitt bidrag. By-funksjonen, som angitt i dokumentasjonen, kan imidlertid være som en wrapper for tapply. Kraften av ved oppstår når vi vil beregne en oppgave som ikke kan håndtere. Et eksempel er denne koden: Hvis vi skriver ut disse to objektene, ct og cb. vi har i hovedsak de samme resultatene og de eneste forskjellene er i hvordan de blir vist og de forskjellige klassetributtene, henholdsvis for cb og array for ct. Som jeg har sagt, oppstår kraften når vi ikke kan bruke, tapply, følgende kode er et eksempel: R sier at argumenter må ha samme lengder, si at vi vil beregne oppsummeringen av alle variabler i iris langs faktoren Arter: men R kan ikke gjøre det fordi det ikke vet hvordan man skal håndtere. Med funksjonen R avsender du en bestemt metode for dataramme klassen, og la sammendragsfunksjonen fungere selv om lengden på det første argumentet (og typen for) er forskjellig. det fungerer faktisk og resultatet er veldig overraskende. Det er et objekt av klasse ved at langs arter (si for hver av dem) beregner oppsummeringen av hver variabel. Merk at hvis det første argumentet er en dataramme. den sendte funksjonen må ha en metode for den aktuelle klasse objekter. For eksempel bruker vi denne koden med den gjennomsnittlige funksjonen vi vil ha denne koden som ikke har noen mening i det hele tatt: aggregat kan ses som en annen en annen måte å bruke tapply hvis vi bruker den på en slik måte. De to umiddelbare forskjellene er at det andre argumentet til aggregat må være en liste mens tapply kan (ikke obligatorisk) være en liste og at utgangen av aggregat er en dataramme mens den ene av tapply er en matrise. Kraften i aggregatet er at den enkelt kan håndtere delsett av dataene med undergruppeargument og at den har metoder for ts-objekter og formel også. Disse elementene gjør aggregatet lettere å jobbe med som tapply i noen situasjoner. Her er noen eksempler (tilgjengelig i dokumentasjon): Vi kan oppnå det samme med tapply, men syntaxen er litt vanskeligere og utdataene (under noen omstendigheter) mindre lesbare: Det er andre tider når vi ikke kan bruke eller tapply, og vi må bruke aggregat. Vi kan ikke få det forrige resultatet med tapply i en samtale, men vi må beregne gjennomsnittet langs Måned for hvert element og kombinere dem (merk også at vi må ringe na. rm SUN. Fordi formelmetodene til aggregatfunksjonen har som standard na. action na. omit): samtidig med at vi bare ikke kan oppnå det faktum at følgende funksjonsanrop returnerer en feil (men mest sannsynlig er det relatert til den medfølgende funksjonen, betyr): Andre ganger er resultatene det samme og forskjellene er bare i klassen (og så hvordan det vises trykt og ikke bare - for eksempel hvordan du deler det) objekt: Den forrige koden oppnår det samme målet og resultater, på noen punkter, hvilket verktøy som skal brukes er bare en sak av personlig smak og behov de to foregående gjenstandene har svært forskjellige behov for subsetting. Det er mange gode svar som diskuterer forskjeller i brukstilfeller for hver funksjon. Ingen av svaret diskuterer forskjellene i ytelsen. Det er rimelig fordi ulike funksjoner forventer ulike innganger og produserer ulike utdata, men de fleste har generelt et generelt mål å evaluere av seriegrupper. Mitt svar kommer til å fokusere på ytelse. På grunn av ovenfor inngangsopprettelsen fra vektorene inngår i timingen, blir også funksjonen for bruk ikke målt. Jeg har testet to forskjellige funksjoner sum og lengde samtidig. Volumetestet er 50M på inngang og 50K på utgang. Jeg har også tatt med to nåværende populære pakker som ikke ble mye brukt på det tidspunktet spørsmålet ble spurt, data. table og dplyr. Begge er definitivt verdt å se om du sikter mot god ytelse. Besvart 8. desember kl. 22:42 Er det normalt at dplyr er lavere enn applt-funksjonene. ndash Dimitri Petrenko 8 Juni 16 kl 9:35 DimitriPetrenko Jeg tror ikke det, ikke sikker på hvorfor det er her. Det er best å teste mot dine egne data, da det er mange faktorer som kommer inn i spill. ndash jangorecki 8. juni kl. 11:48 Det er kanskje verdt å nevne ave. Ave er tapply s vennlig kusine. Det returnerer resultater i et skjema som du kan koble rett tilbake til datarammen. Det er ingenting i basepakken som fungerer som ave for hele datarammer (som ved er som tapply for datarammer). Men du kan fudge det: Besvart 6. november 14 klokken 0:00 Til tross for alle de gode svarene her, er det 2 flere basfunksjoner som fortjener å bli nevnt, den nyttige ytre funksjonen og den dype eapplyfunksjonen ytre er en veldig nyttig funksjon gjemt som en mer verdslig en. Hvis du leser hjelpen til ytre, sier beskrivelsen: Det som virker som dette, er bare nyttig for lineære algebra type ting. Det kan imidlertid brukes mye som mapply å bruke en funksjon til to vektorer av innganger. Forskjellen er at mapply vil bruke funksjonen til de to første elementene og deretter de andre to etc, mens ytre vil bruke funksjonen til hver kombinasjon av ett element fra den første vektoren og en fra den andre. For eksempel: Jeg har personlig brukt dette når jeg har en vektor av verdier og en vektor av forhold og ønsker å se hvilke verdier som oppfyller hvilke forhold. eapply er like laplig bortsett fra at det i stedet for å bruke en funksjon til hvert element i en liste, gjelder det en funksjon for hvert element i et miljø. For eksempel hvis du vil finne en liste over brukerdefinerte funksjoner i det globale miljøet: Oppriktig bruker jeg ikke så mye, men hvis du bygger mange pakker eller lager mange miljøer, kan det være nyttig. besvart 16. mai kl 16:59
No comments:
Post a Comment