2015-03-08 3 views
1

J'ai une base de données qui contient un ID de parcelle (plotID), un code d'espèce d'arbre (espèces) et une valeur de couverture (couverture). Vous pouvez voir qu'il y a plusieurs enregistrements d'espèces d'arbres dans l'une des parcelles. Comment puis-je additionner le champ "couverture" s'il y a des lignes "espèces" en double dans chaque parcelle?Comment faire la somme des lignes en fonction de plusieurs conditions - R?

Par exemple, voici quelques exemples de données:

# Sample Data 
plotID = c("SUF200001035014", "SUF200001035014", "SUF200001035014", "SUF200001035014", "SUF200001035014", "SUF200046012040", 
     "SUF200046012040", "SUF200046012040", "SUF200046012040", "SUF200046012040", "SUF200046012040", "SUF200046012040") 
species = c("ABBA", "BEPA", "PIBA2", "PIMA", "PIRE", "PIBA2", "PIBA2", "PIMA", "PIMA", "PIRE", "POTR5", "POTR5") 
cover = c(26.893939, 5.681818, 9.469697, 16.287879, 1.893939, 16.287879, 4.166667, 10.984848, 16.666667, 11.363636, 18.181818, 
      13.257576) 
df_original = data.frame(plotID, species, cover) 

enter image description here

Et voici la sortie prévue:

# Intended Output 
plotID2 = c("SUF200001035014", "SUF200001035014", "SUF200001035014", "SUF200001035014", "SUF200001035014", "SUF200046012040", 
      "SUF200046012040", "SUF200046012040", "SUF200046012040") 
species2 = c("ABBA", "BEPA", "PIBA2", "PIMA", "PIRE", "PIBA2", "PIMA", "PIRE", "POTR5") 
cover2 = c(26.893939, 5.681818, 9.469697, 16.287879, 1.893939, 20.454546, 18.651515, 11.363636, 31.439394) 
df_intended_output = data.frame(plotID2, species2, cover2) 

enter image description here

Répondre

5

facile avec aggregate

aggregate(cover~species+plotID, data=df_original, FUN=sum) 

plus facile avec data.table

as.data.table(df_original)[, sum(cover), by = .(plotID, species)] 
3

Vous pouvez le faire de plusieurs façons. En utilisant base-r, dplyr et data.table serait le plus typique.

Voici la façon de » dplyr:

library(dplyr) 

df_original %>% group_by(plotID, species) %>% summarize(cover = sum(cover)) 

#   plotID species  cover 
#1 SUF200001035014 ABBA 26.893939 
#2 SUF200001035014 BEPA 5.681818 
#3 SUF200001035014 PIBA2 9.469697 
#4 SUF200001035014 PIMA 16.287879 
#5 SUF200001035014 PIRE 1.893939 
#6 SUF200046012040 PIBA2 20.454546 
#7 SUF200046012040 PIMA 27.651515 
#8 SUF200046012040 PIRE 11.363636 
#9 SUF200046012040 POTR5 31.439394 

Ce serait le moyen de base r:

aggregate(df_original$cover, by=list(df_original$plotID, df_original$species), FUN=sum) 

Et une façon data.table -

library(data.table) 
    DT <- as.data.table(df_original) 
    DT[, lapply(.SD,sum), by = "plotID,species"] 
1

Comme mentionné ci-dessus, ddply à partir du paquet plyr

library(plyr) 
    ddply(df_original, c("plotID","species"), summarise,cover2= sum(cover)) 


      plotID   species cover2 
    1  SUF200001035014 ABBA 26.893939 
    2  SUF200001035014 BEPA 5.681818 
    3  SUF200001035014 PIBA2 9.469697 
    4  SUF200001035014 PIMA 16.287879 
    5  SUF200001035014 PIRE 1.893939 
    6  SUF200046012040 PIBA2 20.454546 
    7  SUF200046012040 PIMA 27.651515 
    8  SUF200046012040 PIRE 11.363636 
    9  SUF200046012040 POTR5 31.439394