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

时间:2016-09-07 12:05:35

标签: r reshape

您好我在一系列网站上有淡水鱼数据集,多年来每月都会重复访问。每行都有找到的物种,总数和状态(即测试结果的正数或负数)。

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

认为我可以使用重塑功能,但仍需要在网站访问中求和,因为重塑将占用第一行。我的想法是使用split / apply / aggregate / for loops等,但尝试了各种组合,而不是任何地方。道歉我不熟悉R.任何评论赞赏!

1 个答案:

答案 0 :(得分:1)

使用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在reshape2中可以做同样的事情,利用dcast同时聚合和重塑宽格式的能力。

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