Young Grasshopper
Young Grasshopper

Reputation: 47

How do I add specific data contained in rows?

I'm new to R. Here is my specific question. Let's say I'm working with the following data set called "data" for this example. My headers are state, type, and value.

structure(list(state = structure(c(1L, 1L, 1L, 1L, 2L, 2L), .Label = c("AK", 
"AL"), class = "factor"), type = structure(c(2L, 2L, 1L, 1L, 
2L, 1L), .Label = c(" D", " R"), class = "factor"), value = c(100L, 
200L, 100L, 150L, 100L, 150L)), .Names = c("state", "type", "value"
), class = "data.frame", row.names = c(NA, -6L))



  state type value
1    AK    R   100
2    AK    R   200
3    AK    D   100
4    AK    D   150
5    AL    R   100
6    AL    D   150

I want to write a function that will add up the values for each type and state. For example. For AK type R the output would be 300. For AK type D the output would be 250. For AL type R the output would be 100, and for AL type D the output would be 150.

Upvotes: 3

Views: 129

Answers (5)

A5C1D2H2I1M1N2O1R2T1
A5C1D2H2I1M1N2O1R2T1

Reputation: 193657

For the sake of completeness, there's also the "data.table" package, and by in base R. Assuming your dataset is called "myd":

by(myd$value, list(myd$state, myd$type), FUN=sum)
# : AK
# :  D
# [1] 250
# ------------------------------------------------------------------------------ 
# : AL
# :  D
# [1] 150
# ------------------------------------------------------------------------------ 
# : AK
# :  R
# [1] 300
# ------------------------------------------------------------------------------ 
# : AL
# :  R
# [1] 100

library(data.table)
DT <- data.table(myd)
DT[, sum(value), by = "state,type"]
#    state type  V1
# 1:    AK    R 300
# 2:    AK    D 250
# 3:    AL    R 100
# 4:    AL    D 150

Upvotes: 3

Jonathan Dursi
Jonathan Dursi

Reputation: 50937

You can just use tapply

data <- read.csv(header=TRUE,text="state, type, value
AK, R, 100
AK, R, 200
AK, D, 100
AK, D, 150
AL, R, 100
AL, D, 150")

tapply(data$value, list(data$state,data$type), sum)
#     D   R
# AK  250 300
# AL  150 100

Upvotes: 5

Jilber Urbina
Jilber Urbina

Reputation: 61214

Although @Matthew Lundberg's answer is the best one here's some alternatives.

If you really want to use plyr you could do:

ddply(DF, .(state, type), numcolwise(sum))
  state type value
1    AK    D   250
2    AK    R   300
3    AL    D   150
4    AL    R   100

Here's another solution using reshape2 package

library(reshape2)
dcast( melt(DF), state + type ~ variable, sum)
Using state, type as id variables
  state type value
1    AK    D   250
2    AK    R   300
3    AL    D   150
4    AL    R   100

If you want just a vector then this could be useful:

sapply(with(DF, split(value, list(state, type))), sum)
AK.D  AL.D  AK.R  AL.R 
250   150   300   100 

Upvotes: 5

MattBagg
MattBagg

Reputation: 10478

A plyr solution would be:

ddply(data, .(state,type),summarise, total=sum(value, na.rm = TRUE))
#   state type total
# 1    AK    D   250
# 2    AK    R   300
# 3    AL    D   150
# 4    AL    R   100

Upvotes: 3

Matthew Lundberg
Matthew Lundberg

Reputation: 42679

Not plyr, but just aggregate

> aggregate(value~state+type, data=data,FUN=sum)
  state type value
1    AK    D   250
2    AL    D   150
3    AK    R   300
4    AL    R   100

Upvotes: 7

Related Questions