-1

I have a dataframe like this:

data <- read.table(text="group;  yr1;   yr2;    val
  a;        1945;   1946;   20
  a;        1945;   1946;   50
  a;        1947;   1948;   40
  b;        1926;   1927;   45
  b;        1927;   1928;   -10
  b;        1927;   1928;   -15 ", sep=";", header=T, stringsAsFactors = FALSE)

Whats the best way to sum up the column of val for each pair of years by group so that the result would look like the following?

group   yr1     yr2     val
a       1945    1946    70
a       1946    1947    40
b       1926    1927    45
b       1927    1928    -25
ekad
  • 14,436
  • 26
  • 44
  • 46
nebuloso
  • 91
  • 7

2 Answers2

5

In base R:

aggregate(val ~ group + yr1 + yr2, data, sum)
#  group  yr1  yr2 val
#1     b 1926 1927  45
#2     b 1927 1928 -25
#3     a 1945 1946  70
#4     a 1947 1948  40
talat
  • 68,970
  • 21
  • 126
  • 157
3

Try data.table for bigger datasets

library(data.table)
setDT(data)[, list(val=sum(val)), by=list(group, yr1, yr2)]
#    group  yr1  yr2 val
#1:     a 1945 1946  70
#2:     a 1947 1948  40
#3:     b 1926 1927  45
#4:     b 1927 1928 -25
akrun
  • 874,273
  • 37
  • 540
  • 662