0

我不熟悉使用 reshape2 及其功能。我有一个数据表 d,我正在尝试汇总有关年站物种计数的数据,以获得每年所有站的每个物种的平均计数:

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

我使用 dcast 来聚合丰度,但我似乎得到的是一个忽略生成的 NaN 结果的总和,而不是平均值:

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

我想要的是:

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

使用参数 fill=0 只会导致 NaN 被 0 替换。

我会非常感谢任何建议。我已阅读文档并寻找教程,但无法解决此问题。

4

2 回答 2

0

术语“平均”的使用并不是特别标准。我认为创建一个名为的新变量mean_abundance将是最好的解决方案。

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

dm <- dcast(d, year~ species,value.var="mean_abundance")
dm[is.na(dm)] <- 0
于 2017-06-09T10:24:40.193 回答
0

我们可以做到这一点tidyverse

library(tidyverse)
d %>%
    group_by(year) %>%
    mutate(mean_abundance = abundance/n()) %>%
    spread(species, mean_abundance, fill = 0)
于 2017-06-09T11:06:22.890 回答