R脚本重塑和统计数据集中的列



嗨,我有一个淡水鱼的数据集,在一系列地点,多年来每月重复访问。每行都有发现的物种、总数和状态(即检测结果为阳性或阴性)。

sample_ID   site    coll_date   species TOT inf_status
382870  site 1  27/10/2007  Species B   1   positive
382872  site 2  27/10/2007  Species D   1   positive
487405  site 3  28/10/2007  Species A   1   positive
487405  site 3  28/10/2007  Species A   1   positive
382899  site 4  03/11/2007  Species A   1   positive
382900  site 5  03/11/2007  Species A   1   positive
382901  site 5  03/11/2007  Species A   1   positive
382902  site 6  03/11/2007  Species A   1   positive
382903  site 7  09/12/2007  Species B   1   positive
382904  site 8  05/02/2008  Species C   9   negative
382905  site 8  05/02/2008  Species A   13  negative
382906  site 9  14/02/2008  Species A   1   positive
382907  site 9  14/02/2008  Species A   1   positive

我需要重新格式化数据,以便每个站点访问只有一行(即在给定的站点名称和日期组合中),按物种和鱼类状态(即speciesA_pos, SpeciesA_neg, Sp_B_pos..等等)。

site    coll_date   SP_A_pos    SP_A_neg    SP_B_pos    SP_B_neg    SP_C_pos      SP_C_neg  SP_D_pos    SP_D_neg
site 1  27/10/2007  0   0   1   0   0   0   0   0
site 2  27/10/2007  0   0   0   0   0   0   1   0
site 3  28/10/2007  3   0   0   0   0   0   0   0
site 4  03/11/2007  1   0   0   0   0   0   0   0
site 5  03/11/2007  2   0   0   0   0   0   0   0
site 6  03/11/2007  1   0   0   0   0   0   0   0
site 7  09/12/2007  0   0   1   0   0   0   0   0
site 8  05/02/2008  0   13  0   0   0   9   0   0
site 9  14/02/2008  2   0   0   0   0   0   0   0

认为我可以使用重塑功能,但仍然需要在站点访问中求和,因为重塑将取第一行。我的想法是使用分割/应用/聚合/循环等,但尝试了各种组合,没有得到任何地方。抱歉,我不熟悉r,欢迎任何评论!

使用tidyr/dplyr,您可以创建一个代表物种和状态组合的新变量,将每个站点/日期/物种状态的总和求和,然后将物种状态spread到列中,填充总和。

library(tidyr)
library(dplyr)
dat %>%
    unite(sp_status, species, inf_status) %>%
    group_by(site, coll_date, sp_status) %>%
    summarise(TOT = sum(TOT)) %>%
    spread(key = sp_status, value = TOT, fill = 0)

同样的事情可以用dcast来做,利用dcast同时聚合和重塑成宽格式的能力。

library(reshape2)
dcast(dat, site + coll_date ~ species + inf_status, value.var = "TOT", fun.aggregate = sum)

相关内容

  • 没有找到相关文章

最新更新