用于重塑和计算数据集中列的 r 脚本

r script to reshape and count columns within dataset

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

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

我想我可以使用 reshape 函数,但仍然需要在站点访问中求和,因为 reshape 将占据第一行。我的想法是使用 split/apply/aggregate/for 循环等,但尝试了各种组合,但没有取得任何进展。抱歉,我不熟悉 R。任何意见表示赞赏!

有了tidyr/dplyr,你可以创建一个代表物种和状态组合的新变量,将每个site/date/species-status的总数相加,然后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)

同样的事情可以在 reshape2 中使用 dcast 完成,利用 dcast 的能力同时聚合和重塑为宽格式。

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