您好我在一系列网站上有淡水鱼数据集,多年来每月都会重复访问。每行都有找到的物种,总数和状态(即测试结果的正数或负数)。
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.任何评论赞赏!
答案 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)