2017-07-03 4 views
-2

Ich habe eine Tabelle (Klasse) wie folgt aus:R - Wie bekomme ich einen Mittelwert und einen Mittelwert mit einem Stringfeld?

County Age.Group 
Albany  0-5 
Albany  10-15 
Albany  10-15 
new York 5-10 
new York 5-10 
new York 0-5 
LI   0-5 
LI   0-5 
LI   0-5 

Ich muss erhalten Mittelwert und Median von Grafschaft damit ich weiß, ich brauche das zu berechnen, wie viele Male Albany, New York, und LI in der Liste erschienen und dann die mittlere und mittlere Funktion verwenden. Ich bin nicht sicher, wie dies zu tun ist, da ich eine Fehlermeldung erhalte, wenn ich Mittelwert oder Median verwende, da dieses Feld keine ganze Zahl ist. Bitte helfen Sie ...

+3

Was ist Ihr erwartete Ausgabe für, sagen wir, Albany? – brittenb

Antwort

2

Nicht sicher, was ist Ihre genaue Ausgabe erwartet, wenn es nicht das Folgende ist, sollte es Ihnen helfen, etwas weiter.

> # Load data 
> df <- data.frame(County = c("Albany", "Albany", "Albany", "new York", 
+        "new York", "new York", "LI", "LI", "LI"), 
+     Age.Group = c("0-5", "10-15", "10-15", "5-10", "5-10", "0-5", 
+        "0-5", "0-5", "0-5"), stringsAsFactors = FALSE) 
> 
> # Split the age by "-", resulting in a list 
> age_split <- strsplit(df[, 2], split = "-", fixed = TRUE) 
> 
> # Turn numeric and take middle point of group, sapply turns back into vector 
> df$Age.Group.Mean <- sapply(age_split, function(x) mean(as.numeric(x))) 
> 
> # Print df 
> df 
    County Age.Group Age.Group.Mean 
1 Albany  0-5   2.5 
2 Albany  10-15   12.5 
3 Albany  10-15   12.5 
4 new York  5-10   7.5 
5 new York  5-10   7.5 
6 new York  0-5   2.5 
7  LI  0-5   2.5 
8  LI  0-5   2.5 
9  LI  0-5   2.5 
> 
> # Calculate what is needed 
> aggregate(Age.Group.Mean ~ County, data = df, median) 
    County Age.Group.Mean 
1 Albany   12.5 
2  LI   2.5 
3 new York   7.5 
> aggregate(Age.Group.Mean ~ County, data = df, mean) 
    County Age.Group.Mean 
1 Albany  9.166667 
2  LI  2.500000 
3 new York  5.833333 
0

ich, dass @ snoram Interpretation Ihrer gewünschten Ausgabe Richtig- ist, hier wenn ja annehmen, wäre eine dplyr Alternative ist:

df2 <- df %>% 
    group_by(County) %>% 
    summarise(
     mean.age = mean(as.numeric(unlist(strsplit(Age.Group, "-")))), 
     median.age = median(as.numeric(unlist(strsplit(Age.Group, "-")))) 
    ) 

> data.frame(df2) 
    County mean.age median.age 
1 Albany 9.166667  10.0 
2  LI 2.500000  2.5 
3 new York 5.833333  5.0 

Daten:

df <- structure(list(County = c("Albany", "Albany", "Albany", "new York", 
           "new York", "new York", "LI", "LI", "LI"), Age.Group = c("0-5", 
                         "10-15", "10-15", "5-10", "5-10", "0-5", "0-5", "0-5", "0-5")), .Names = c("County", 
                                            "Age.Group"), row.names = c(NA, -9L), class = "data.frame") 
Verwandte Themen