Mam ramkę danych R taką jak ta:
age group
1 23.0883 1
2 25.8344 1
3 29.4648 1
4 32.7858 2
5 33.6372 1
6 34.9350 1
7 35.2115 2
8 35.2115 2
9 35.2115 2
10 36.7803 1
...
Potrzebuję uzyskać ramkę danych w następującej formie:
group mean sd
1 34.5 5.6
2 32.3 4.2
...
Numer grupy może się różnić, ale ich nazwy i ilość można uzyskać dzwoniąc levels(factor(data$group))
Jakie manipulacje należy wykonać przy użyciu danych, aby uzyskać wynik?
r
data-transformation
Jurij Pietrowski
źródło
źródło
aggregate
,tapply
a następnie stackoverflow.com, aby uzyskać wszelkie pytania dotyczące tego typu kodowania.Odpowiedzi:
Oto wariant plyr z jedną linią przy użyciu ddply :
Oto kolejny wariant z jedną linią, wykorzystujący nowy pakiet data.table .
Ten jest szybszy, chociaż jest to zauważalne tylko na stole z 100k rzędami. Czasy na moim Macbooku Pro z procesorem Core 2 Duo 2,53 Ghz i R 2.11.1:
Dalsze oszczędności są możliwe, jeśli wykorzystamy
setkey
:źródło
dt <- data.table(dtf)
zamiastdt <- data.table(dt)
w drugim bloku kodu. W ten sposób tworzysz tabelę danych z ramki danych zamiast zdt
funkcji zstats
pakietu. Próbowałem go edytować, ale nie mogę edytować mniej niż sześciu znaków.data.table
jest najlepszym sposobem na agregację danych i ta odpowiedź jest świetna, ale wciąż rysuje tylko powierzchnię. Oprócz tego, że jest syntaktycznie lepszy, jest także niezwykle elastyczny i ma wiele zaawansowanych funkcji, które obejmują połączenia i mechanikę wewnętrzną. Sprawdź FAQ, stronę github lub kurs, aby uzyskać więcej informacji.Jedną z możliwości jest użycie funkcji agregującej . Na przykład,
daje drugą kolumnę pożądanego wyniku.
źródło
data.frame(group=levels(factor(data$group)),mean=(aggregate(data$age, by=list(data$group), FUN=mean)$x),sd=(aggregate(data$age, by=list(data$group), FUN=sd)$x))
Zrobiłem to, dzwoniąc, ale nie jestem pewien, czy to właściwy sposób. Nie jestem pewien, co się stanie, wtedy wyniki powiązanych kolumn będą w innej kolejności (myślę, że jest to możliwe). Jakie jest twoje zdanie?aggregate()
:aggregate(age ~ group, data=dat, FUN = function(x) c(M=mean(x), SD=sd(x)))
Ponieważ manipulujesz ramką danych,
dplyr
pakiet jest prawdopodobnie najszybszym sposobem na zrobienie tego.lub równoważnie, używając operatora
dplyr
/magrittr
pipe:EDYCJA pełnego wykorzystania operatora rur:
źródło
dplyr
. Sprawiło, że tak wiele zadań R stało się prostych, a wiele z tych metod stało się przestarzałych.plyr
zamiastdplyr
powodował problem.Świetnie, dzięki bastast za dodanie rozwiązania dplyr!
Okazuje się, że wtedy dplyr i data.table są bardzo blisko:
data.table jest wciąż najszybsza, po niej bardzo dokładnie następuje dplyr (), co, co ciekawe, wydaje się szybsze na data.frame niż data.table:
źródło
Oprócz istniejących sugestii możesz chcieć sprawdzić
describe.by
funkcję wpsych
pakiecie.Zapewnia szereg statystyk opisowych, w tym średnią i odchylenie standardowe na podstawie zmiennej grupującej.
źródło
Odkryłem, że funkcja
summaryBy
w pakiecie doBy jest najwygodniejsza do tego:źródło
Skorzystaj z
sqldf
pakietu. Dzięki temu możesz teraz używać SQL do podsumowywania danych. Po załadowaniu możesz napisać coś takiego -źródło
Edytowane: Zgodnie z sugestiami chl
Funkcja, której szukasz, nazywa się „tapply”, która stosuje funkcję na grupę określoną przez współczynnik.
Naprawdę proponuję przejść przez podstawowy samouczek R wyjaśniający wszystkie powszechnie stosowane struktury danych i metody. W przeciwnym razie utkniesz w każdym calu podczas programowania. Zobacz to pytanie, aby uzyskać zbiór bezpłatnych dostępnych zasobów.
źródło
for
pętli tutaj, możesz skonstruować wbudowaną ramkę danych, IMO. W przypadkutapply
połączenia użyjfunction(x) c(mean(x),sd(x)))
icbind
wyniku, ponieważ PO poprosił o obie statystyki. Równieżddply
z pakietu plyr można to zrobić płynnie.cbind("mean"=mperage,"stdev"=stperage) gives no 'group' column. Will be joining by
cbind (grupa = poziomy (czynnik (dane $ grupa)), „mean” = mperage, „stdev” = stperage) „prawda?Oto przykład z funkcją,
aggregates()
którą zrobiłem sobie jakiś czas temu:Daje następujący wynik:
Może możesz uzyskać ten sam wynik, zaczynając od funkcji R split ():
Wróćmy do wyjścia
aggregates
funkcji. Można przekształcić go w pięknym tabeli przy użyciureshape()
,xtabs()
iftable()
:To daje:
Piękne, prawda? Możesz wyeksportować tę tabelę do pliku pdf z
textplot()
funkcjągplots
pakietu.Zobacz tutaj rozwiązania innych osób.
źródło