2017-06-09 5 views
0

Ich bin neu bei der Verwendung von reshape2 und seiner Funktionalität. Ich habe eine Datentabelle, d, für die ich an den Stationen in den nächsten Jahren aggregierte Daten über Arten zählt bin versucht, für jedes Jahr für jede Spezies über alle Stationen der Mittelwert zählen zu erhalten:Verwenden von Rscast, um mit fehlenden Einträgen zu aggregieren

d<-data.table(station=c(1,1,4,3),year=c(2000,2000,2001,2000), 
    species=c("cat","dog","dog","owl"),abundance=c(10,20,30,10)) 
d 

> station year species abundance 
1:  1 2000  cat  10 
2:  1 2000  dog  20 
3:  4 2001  dog  30 
4:  3 2000  owl  10 

Ich benutze dcast auf Fülle aggregieren, aber ich scheine zu bekommen, was eine Summe, die den NaN Ergebnisse erzeugt, sondern als ein Mittelwert ignoriert:

dm<-dcast(d, year~ species,value.var="abundance",fun.aggregate = mean) 
dm 
> year cat dog owl 
1: 2000 10 20 10 
2: 2001 NaN 30 NaN 

Was ich will, ist:

> year cat dog owl 
1: 2000 3.33 6.67 3.33 
2: 2001 0  30 0 

Mit der argment fill = 0 Ergebnisse in den NaNs wird durch 0 ersetzt.

Ich wäre sehr dankbar für jeden Rat. Ich habe die Dokumentation gelesen und nach Tutorials gesucht, konnte das aber nicht lösen.

Antwort

0

Die Verwendung des Begriffs "Mittelwert" ist nicht besonders Standard. Ich denke, das Erstellen einer neuen Variablen namens mean_abundance wäre die beste Lösung.

d[, mean_abundance := abundance/length(abundance), by = year] 

dm <- dcast(d, year~ species,value.var="mean_abundance") 
dm[is.na(dm)] <- 0 
0

Wir können dies tun, mit tidyverse

library(tidyverse) 
d %>% 
    group_by(year) %>% 
    mutate(mean_abundance = abundance/n()) %>% 
    spread(species, mean_abundance, fill = 0) 
Verwandte Themen