2016-06-27 12 views
0

Ich versuche, eine Summenspalte zu einer großen Datei hinzuzufügen, die Daten enthält. Ich möchte jeden Monat addieren und eine Spalte rechts von der letzten Spalte des Monats hinzufügen.Summenspalte in einem Datenrahmen in R

Unten ist ein reproduzierbares Beispiel:

df <- data.frame("6Jun06" = c(4, 5, 9), 
    "13Jun06" = c(4, 5, 9), 
    "20Jun06" = c(4, 5, 9), 
    "03Jul16" = c(1, 2, 3), 
    "09Jul16" = c(1, 2, 3), 
    "01Aug16" = c(1, 2, 5)) 

Also in diesem Fall würde ich drei Spalten haben muß (nach Juni, Juli und August).

X6.Jun.06 X13.Jun.06 X20.Jun.06 Jun.Sum X03.Jul.16 X09.Jul.16 Jul.Sum X01.Aug.16 Aug.Sum 
1   4   4   4  Sum   1   1  Sum   1  Sum 
2   5   5   5  Sum   2   2  Sum   2  Sum 
3   9   9   9  Sum   3   3  Sum   5  Sum 

Ich bin nicht sicher, wie jeden Monat einzeln zu summieren. Ich weiß, dass es eingebaute Summenfunktionen gibt, aber die Funktionen, die ich ausprobiert habe, passen nicht zu meinem Problem, weil sie nur eine allgemeine Summe machen.

Antwort

1

Wenn Sie R neu sind, ist ein guter Anfang einen Blick auf das dplyr Ökosystem nimmt (sowie andere Pakete von Hadley Wickham).

library(dplyr) 
library(tidyr) 

df %>% 
    mutate(id = 1:nrow(df)) %>% 
    gather(date, value, -id) %>% 
    mutate(Month = month.abb[apply(sapply(month.abb, function(mon) {grepl(mon, .$date)}), 1, which)]) %>% 
    group_by(id, Month) %>% 
    summarize(sum = sum(value)) %>% 
    spread(Month, sum) %>% 
    left_join(mutate(df, id = 1:nrow(df)), .) %>% 
    select(-id) 
+0

Vielen Dank für den Vorschlag, die Pakete neu zu ordnen. Sowohl Ihre als auch Sotos 'Antworten funktionierten großartig. – Nik

1

Sie machen das Leben etwas schwer für sich selbst mit Variablen Namen, die mit einer Ziffer beginnen, als R wird ein X vor ihnen einfügen. Aber hier ist eine Möglichkeit, wie Sie die gewünschten Summen erhalten können.

#1. Use the package `reshape2`: 

    library(reshape2) 
    dfm <- melt(df) 

#2. Get rid of the X in the dates, then convert to a date using the package `lubridate` and extract the month: 

    library(lubridate) 
    dfm$Date <- dmy(substring(dfm$variable, 2)) 
    dfm$Month <- month(dfm$Date) 

#3. Then calculate the sum for each month using the `dplyr` package: 

    library(dplyr) 
    dfm %>% group_by(Month) %>% summarise(sum(value)) 
+0

Ich denke, Sie müssen Ihre Lösung gegen OP Frage (und erwartete Ausgabe) überprüfen – Sotos

1

Hier ist eine Möglichkeit, die die neuen Spalten am Ende des Datenrahmens fügt hinzu:

cbind(df, sapply(unique(gsub('\\d+', '', names(df))), function(i) 
          rowSums(df[grepl(i, sub('\\d+', '', names(df)))]))) 

# 6Jun06 13Jun06 20Jun06 03Jul16 09Jul16 01Aug16 Jun Jul Aug 
#1  4  4  4  1  1  1 12 2 1 
#2  5  5  5  2  2  2 15 4 2 
#3  9  9  9  3  3  5 27 6 5 
+0

Vielen Dank. Das hat perfekt funktioniert! – Nik

Verwandte Themen