2017-11-08 3 views
0

ich eine Reihe von Panel-Daten ähnlich zu haben:SUMIFS in R - eine Teilmenge aus von mehreren Kriterien zu schaffen und eine bestimmte Spalte Summieren

city <- c("ARI", "ATL", "BAL", "BUF", "CAR", "ARI", "ATL", "BAL", "BUF", "CAR", "ARI", "ATL", "BAL", "BUF", "CAR", "ARI", "ATL", "BAL", "BUF", "CAR", "ARI", "ATL", "BAL", "BUF", "CAR") 
week <- c(1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5) 
df <- as.data.frame(cbind(city, week)) 
df$week <- as.numeric(df$week) 
df$x <- c(6, 3, 9, 12, 4, 3, 7, 8, 2, 12, 15, 6, 3, 9, 0, 14, 18, 2, 21, 15, 17, 9, 10, 1, 22) 

Ich mag eine neue Variable erstellen, df$y, das fasst df$x für jede Stadt und für jede Woche vor der Woche, die gerade beobachtet wird. So sollte zum Beispiel df$y[25] gleich 31 sein, weil sum(df[df$city == "CAR" & df$week < 5, 3]) gleich 31 ist.

Meine Frage ist, wie kann ich dies in einer Funktion schreiben, um dies automatisch zu tun?

sum(df[df$city == "CAR" & df$week < 5, 3]) für jede Team- und Wochenkombination zu verwenden wäre mühsam. Meine natürliche Neigung ist, etwas wie df$y <- sum(df[df$city == df$city & df$week < df$week, 3]) zu schreiben, aber das macht keinen Sinn. Ich bin neu in R und verstehe Funktionen nicht vollständig; Aber ist das der beste Weg für das, was ich versuche?

Danke für Ihre Hilfe!

+0

Es wäre sowieso nie arbeiten, weil Sie verwendet 'as.data.frame (cbind (...))' zu erstellen die Daten. Ihre logischen Vergleiche werden nicht korrekt sein. Sie sollten 'data.frame()' verwenden, um die Daten zu erstellen. –

Antwort

0

Eine Option mit dplyr

library(dplyr) 
res <- df %>% 
     group_by(city) %>% 
     mutate(y = cumsum(lag(x, default = 0))) 
res[25,] 
# A tibble: 1 x 4 
# Groups: city [1] 
# city week  x  y 
# <fctr> <dbl> <dbl> <dbl> 
#1 CAR  5 22 31 
0

Eine Option mit data.table

setDT(df)[, y := c(0, cumsum(x[-length(x)])), by = 'city'] 
df 
Verwandte Themen