2016-07-29 6 views
1

Ich habe Probleme mit der Erstellung einer neuen Variablen in meinem data.frame. Ich entschuldige mich für den Fragetitel, der vielleicht nicht sehr klar ist. Ich habe eine Datenbank, die wie folgt aussieht:Anzeige in data.frame eine bedingte Zeilenanzahl nach Gruppe

obs year type 
1  2015  A 
2  2015  A 
3  2015  B 
4  2014  A 
5  2014  B 

Ich möchte die aktuelle data.frame eine Spalte (freq2015) hinzuzufügen, die für das Jahr 2015 und melden das Ergebnis ohne Berücksichtigung der betrachtete Jahr die Anzahl der Zeilen nach Typ gibt so solange der Typ derselbe ist. Hier ist die Ausgabe Ich suche:

obs year type freq2015 
1  2015  A   2  (there are 2 obs. of type A in 2015) 
2  2015  A   2  (there are 2 obs. of type A in 2015) 
3  2015  B   1  (there is 1 obs. of type B in 2015) 
4  2014  A   2  (there are 2 obs. of type A in 2015) 
5  2014  B   1  (there are 1 obs. of type B in 2015) 

Ich weiß, wie mein data.frame die Anzahl der Zeilen nach Art von Jahr hinzuzufügen dplyr mit:

data <- data %>% 
    group_by(year, type) %>% 
    mutate(freq = n()) 

Aber dann, für das Jahr ==“ 2014" die hinzugefügte Spalte wird die Anzahl der 2014 Reihen von Rennen angezeigt werden, anstatt dass 2015

ich weiß, wie in eine neues data.frame die Anzahl der Zeilen von Rennen für das Jahr 2015 zu isolieren:

data2015 <- dat[dat$year==2015,] %>% 
     group_by(type) %>% 
     mutate(freq2015 = n()) 

Aber ich weiß nicht, wie man eine Spalte (mit der Anzahl der Zeilen nach Rassen für 2015) für die gesamte data.frame bedingte auf dem Typ der gleiche (wie im Beispiel gezeigt). Ich suche nach einer Lösung, die mich daran hindern würde, die "Typ" -Modalitäten explizit zu verwenden. Das heißt, ich möchte keinen Code verwenden, der R sagt: tue dies, wenn type == A, mach das anders. Der Grund für diese Einschränkung ist, dass ich viel zu viele Typen habe.

Irgendwelche Ideen? Vielen Dank im Voraus.

+0

Warum möchten Sie das tun? Es kann einfacher sein, einen zusammengefassten Datenrahmen der Anzahl der Jahre und Typen zu erstellen. – akash87

Antwort

2

Wenn Sie group_by nur type mit , können Sie die Zeilen summieren, wenn year == 2015.

data %>% 
    group_by(type) %>% 
    mutate(freq2015 = sum(year == 2015)) 

Source: local data frame [5 x 4] 
Groups: type [2] 

    obs year type freq2015 
    <int> <int> <fctr> <int> 
1  1 2015  A  2 
2  2 2015  A  2 
3  3 2015  B  1 
4  4 2014  A  2 
5  5 2014  B  1 
+0

Dies ist die schnellste Methode. Es funktioniert auch, wenn die zu summierende Variable ein Faktor anstelle einer Ganzzahl ist, was gute Nachrichten sind :) – Elixterra

0

Mit Hilfe der Datentabelle wir tun könnten:

setDT(df) 
setkey(df,type) 
df[ df[ year==2015, .(freq2015=.N), by = type]] 

Ergebnis:

 obs year type freq2015 
1: 1 2015 A  2 
2: 2 2015 A  2 
3: 4 2014 A  2 
4: 3 2015 B  1 
5: 5 2014 B  1 
0

Sie könnten einen left_join() verwenden, wie folgt:

temp <- data %>% 
    filter(year==2015) %>% 
    group_by(type) %>% 
    summarize(freq = n())# %>% 
data <- data %>% left_join(temp, "type") 
0

Wir können dies tun, mit base Rave mit (ohne externe Pakete), und es ist ziemlich schnell auch.

df1$freq2015 <- with(df1, ave(year == 2015, type, FUN = sum)) 
df1$freq2015 
#[1] 2 2 1 2 1 
+0

In der Tat funktioniert es vollkommen in Ordnung. Es ist jedoch nicht so intuitiv (für mich zumindest, wer neu in R ist), einen Befehl zu verwenden, der dazu dient, den Durchschnitt für das Zählen zu berechnen. Wie würdest du diesen Code mit einem Satz erklären? (Ich frage, weil ich sehen kann, dass es funktioniert, aber ich verstehe nicht wirklich, was ich tue) – Elixterra

+0

@Elixterra Was meinst du mit 'dedicated to calculate average'? Die 'ave' ist eine generische Funktion, aber standardmäßig gibt sie den Durchschnitt, obwohl Sie' FUN' mit jeder anderen Funktion angeben können, wie hier ich 'sum' verwendet habe, um den logischen Index (' year == 2015') gruppiert nach ' Art'. – akrun

+0

Das wusste ich nicht. Ich dachte, 'ave' sollte nur Durchschnittswerte berechnen.Ich wusste nicht, dass es sich um eine generische Funktion handelt, deren Standardaktion es ist, den Durchschnitt zu berechnen, der aber neu definiert werden könnte. Du hast mich falsch bewiesen. Danke für Ihre Antwort. Ich verstehe jetzt, was der Code macht :) – Elixterra