2016-06-16 22 views
2

Also habe ich einen Datenrahmen von Leuten Namen, Alter und ihre Lieblingsfilme gemacht. Ich möchte ein Programm schreiben, das auf den Datenrahmen wirkt, um mir das Durchschnittsalter jeder Person mit einem bestimmten Lieblingsfilm zu geben. Hier ist was ich habe.Arbeiten mit R-Datenrahmen

persons <- list(firstName = c("Steve","Bob","Bill","Chris","Matt","Evan"), lastName = c("Williams","Barker","Barker","Williams","Stevenson","Parker"), age = c(22,30,41,14,9,93), favoriteMovie = c("Alien","The Shining","The Shining","Halloween","Alien","Alien")) 
d1 <- data.frame(persons$firstName,persons$lastName,persons$age,persons$favoriteMovie) 

d1 
    persons.firstName persons.lastName persons.age persons.favoriteMovie 
1    Steve   Williams   22     Alien 
2    Bob   Barker   30   The Shining 
3    Bill   Barker   41   The Shining 
4    Chris   Williams   14    Halloween 
5    Matt  Stevenson   9     Alien 
6    Evan   Parker   93     Alien 

So kann ich es tut mit einer Schleife von if-Anweisungen, aber ich glaube nicht, das der effizienteste Weg, dies zu tun. Ich bin sicher, es gibt eine Art, Werte herauszufiltern, aber ich bin mir nicht sicher.

+0

'Mittelwert (d1 [d1 $ persons.favoriteMovie == "Alien", "persons.age"]), verwenden' –

+0

auch 'tapply (d1 $ Personen. Alter, d1 $ persons.favoriteMovie, mean) '. Eine oder nur eine der verfügbaren Methoden sollte in dem einleitenden Material illustriert worden sein, das Sie studieren sollten. Das kanonische Material wird in "Introduction to R" mit jeder von CRAN gesendeten Kopie geliefert. Dies ist sicherlich auch eine doppelte SO Frage. –

+0

Ich empfehle Ihnen einen Blick auf das [Quick-R-Tutorial] (http://statmethods.net/). Es gibt gute Erklärungen zu verschiedenen Möglichkeiten, mit Daten zu arbeiten. Genauer gesagt, überprüfen Sie die 'Basic Statistics' Abschnitt – Barranka

Antwort

2

Sie by() dafür verwenden können:

by(d1$persons.age, d1$persons.favoriteMovie, mean) 
d1$persons.favoriteMovie: Alien 
[1] 41.33333 
------------------------------------------------------------------------------------------------------------- 
d1$persons.favoriteMovie: Halloween 
[1] 14 
------------------------------------------------------------------------------------------------------------- 
d1$persons.favoriteMovie: The Shining 
[1] 35.5 
+0

R hat all diese netten kleinen eingebauten Funktionen, die ich ständig herausfinden. So einfach! Vielen Dank! – Paul

3

Sie könnten versuchen, tapply

> with(d1, tapply(persons.age, persons.favoriteMovie, mean)) 
     Alien Halloween The Shining 
    41.33333 14.00000 35.50000 

mit Sie migth einen Blick auf this answer

+0

Danke für diesen Link, ich werde es jetzt durchlesen. Sieht nach vielen guten Sachen aus. – Paul

1

Das Paket doBy mit der Funktion zu übernehmen wollen summaryBy kann dir helfen.

library(doBy) 
summaryBy(persons.age~persons.favoriteMovie, data=d1, FUN=c(mean)) 
#persons.favoriteMovie persons.age.mean 
#1     Alien   41.33333 
#2    Halloween   14.00000 
#3   The Shining   35.50000 

Oder Sie könnten dplyr verwenden.

library(dplyr) 
grouped <- group_by(d1, persons.favoriteMovie) 
summarise(grouped, mean=mean(persons.age)) 
# persons.favoriteMovie  mean 
#     (fctr) (dbl) 
#1     Alien 41.33333 
#2    Halloween 14.00000 
#3   The Shining 35.50000 
1

Wir data.table

library(data.table) 
setDT(d1)[,.(persons.age = mean(persons.age)) , persons.favoriteMovie] 
# persons.favoriteMovie persons.age 
#1:     Alien 41.33333 
#2:   The Shining 35.50000 
#3:    Halloween 14.00000