2017-10-04 2 views
-1

So habe ich die folgende Datensatz (dies ist eine kleine Probe/Beispiel, wie es aussieht, mit den Original ist 7k Zeilen und 30 Spalten über 7 Dekaden):Wie verwende ich zusammenfassen und gruppieren, um eine Übersichtstabelle in r zu erstellen?

Year,Location,Population Total, Median Age, Household Total 
2000, Adak, 220, 45, 67 
2000, Akiachak, 567, NA, 98 
2000, Rainfall, 2, NA, 11 
1990, Adak, NA, 33, 56 
1990, Akiachak, 456, NA, 446 
1990, Tioga, 446, NA, NA 

Ich möchte eine Zusammenfassung erstellen Tabelle, die angibt, wie viele Jahre Daten pro Standort für jede Variable verfügbar sind. So etwas wie dies funktionieren würde (für das kleine Beispiel von vorher):

Location,Population Total, Median Age, Household Total 
Adak,1,2,2 
Akiachak,2,0,2 
Rainfall,1,0,1 
Tioga,1,0,0 

Ich bin neu zu R und habe diese beiden Befehle nicht zusammen verwendet, so ich nicht sicher über die Syntax bin. Jede Hilfe wäre wunderbar oder Alternativen.

+0

Sie sollten das Paket 'dplyr' verwenden. Beginnen Sie mit 'group_by (Location)' und schreiben Sie dann Ihre 'summarise' oder' count' Anweisung. Ich schlage vor, ein Tutorial über 'dplyr' zu suchen. –

+0

Auch hier erhalten Sie viel besseres Feedback zu Fragen, wenn Sie ein Beispiel für Ansätze geben, die Sie ausprobiert haben. Manche interpretieren das als Hausaufgabenfrage ... –

+0

Danke! Ich denke darüber nach, alles, was nicht NA ist, auf 1 zu setzen, Na auf 0 und dann die Zeilen zusammenzufassen, während ich die Jahre wegnehme. Aber mein Chef sagt, ich sollte versuchen, diese beiden Funktionen zusammen zu verwenden. – jules

Antwort

1

Eine Lösung mit summarize_all von dplyr:

library(dplyr) 
df %>% 
    group_by(Location) %>% 
    summarize_all(funs(sum(!is.na(.)))) %>% 
    select(-Year) 

Oder können Sie summarize_at verwenden:

df %>% 
    group_by(Location) %>% 
    summarize_at(vars(-Year), funs(sum(!is.na(.)))) 

Ergebnis:

# A tibble: 4 x 4 
    Location PopulationTotal MedianAge HouseholdTotal 
     <chr>   <int>  <int>   <int> 
1  Adak    1   2    2 
2 Akiachak    2   0    2 
3 Rainfall    1   0    1 
4  Tioga    1   0    0 

Daten:

df = read.table(text = "Year,Location,PopulationTotal, MedianAge, HouseholdTotal 
       2000, Adak, 220, 45, 67 
       2000, Akiachak, 567, NA, 98 
       2000, Rainfall, 2, NA, 11 
       1990, Adak, NA, 33, 56 
       1990, Akiachak, 456, NA, 446 
       1990, Tioga, 446, NA, NA", header = TRUE, sep = ",", stringsAsFactors = FALSE) 

library(dplyr)  
df = df %>% 
    mutate_at(vars(PopulationTotal:HouseholdTotal), as.numeric) 
1

Sie können etwas tun:

x %>% 
    group_by(Location) %>% 
    summarise(count_years = n(), 
      count_pop_total = sum(!is.na(Population_Total)), 
      count_median_age = sum(!is.na(Median_Age)), 
      count_house_total = sum(!is.na(Household_Total))) 

wo Sie den Mittelwert mit dem, was den Betrieb möchten Sie ausführen ersetzen können. Sie sollten einen Blick auf die dplyr vignette für allgemeinere Lösungen werfen.

+0

hinzufügen. Ich habe die Frage falsch gelesen – tbradley

+0

Ich änderte meine Antwort zu geben, was OP wollte mit explizit 'group_by' und' summarise', aber die Antwort von @useR mit 'summarize_all' oder' summarize_at' sind wahrscheinlich besser für diese Situation – tbradley

Verwandte Themen