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