【发布时间】:2013-12-11 13:31:13
【问题描述】:
我目前正在尝试计算物种丰度指数,但我对 do.call 命令有点卡住了。
我有一个像这样构建的 DF:
YEAR RN DATE NOM SITE LONG SP SUMNB NB100
1 2011 RNN027 15056 ESTAGNOL RNN027-Estagnol 02 310 Anthocharis cardamines (Linnaeus, 1758) 1 0.3225806
2 2011 RNN027 15075 ESTAGNOL RNN027-Estagnol 02 310 Anthocharis cardamines (Linnaeus, 1758) 1 0.3225806
3 2003 RNN027 12166 ESTAGNOL RNN027-Estagnol 03 330 Anthocharis cardamines (Linnaeus, 1758) 2 0.6060606
4 2006 RNN027 13252 ESTAGNOL RNN027-Estagnol 03 330 Anthocharis cardamines (Linnaeus, 1758) 2 0.6060606
5 2006 RNN027 13257 ESTAGNOL RNN027-Estagnol 03 330 Anthocharis cardamines (Linnaeus, 1758) 2 0.6060606
6 2005 RNN027 12895 ESTAGNOL RNN027-Estagnol 01 540 Anthocharis cardamines (Linnaeus, 1758) 2 0.3703704
7 2005 RNN027 12910 ESTAGNOL RNN027-Estagnol 01 540 Anthocharis cardamines (Linnaeus, 1758) 2 0.3703704
为了计算我的索引,我必须隔离每个 SITE/YEAR 组合并取第一个和最后一个日期来编辑它们(减去和加上 7 天)。
我应该可以使用以下命令来做到这一点(因为完成而无法正常工作):
do.call(rbind, by(DF, DF[c("YEAR","SITE")], FUN = function(x) {
tmp <- x[c(1, nrow(x)), ]
tmpmin<-min(tmp$DATE)
tmpmax<-max(tmp$DATE)
tmp1<-tmp1-7
tmp2<-tmp2+7
return(tmp)
但我不知道如何完成我的命令以适合我想要的:我需要保留修改后的日期,并在 SITE/YEAR/SP 的每个组合之前和之后分别添加它们。关键是检测每个站点的所有物种总和的第一个和最后一个观察日期,根据需要修改它们,并将它们添加到我得到的每个物种的时间重新分区中(每个“块”中的两个新行)。
我可以使用 SP 标准在每个“块”之前和之后添加一行,并使用以下代码(但该行是基于现在的第一个和最后一个日期,而不是我想要的日期):
do.call(rbind, by(DF, DF[c("YEAR","SITE", "SP")], FUN = function(x) {
tmp <- x[c(1, seq(nrow(x)), nrow(x)), ]
tmp$DATE[1] <- tmp$DATE[1] - 7
tmp$DATE[nrow(tmp)] <- tmp$DATE[nrow(tmp)] + 7
return(tmp)
}))
我的问题是,如何链接这两个命令以成功地将包含我的第一个命令 (SITE/YEAR) 的日期的行添加到第二个命令 (SITE/YEAR/SP)。我尝试在我的 function(x) 命令以及另一个 do.call 命令中添加一个循环,但它不起作用。
编辑:
@Troy:昨天,我成功地在我的 do.call 命令中添加了一个循环:我的目标是对每个 SITE/YEAR 组合进行子集化,而不考虑物种。在每个子集中,我将我的时间分布的两个限制作为物种总和(因为我没有那个信息)。然后我用我在子集中收集的信息为每个物种写一行。 我的循环在这里为我写了一个包含 N 行的新数据框,用于 N 种具有最小和最大日期(见下文)。我将进一步将这个虚拟数据框与我的实际 DF 合并。
MIN<-data.frame(matrix(NA, nrow = 100, ncol = 9))
colnames(MIN)<-c("YEAR","RN","DATE","NOM","SITE","LONG","SP","SUMNB","NB100" )
MAX<-data.frame(matrix(NA, nrow = 100, ncol = 9))
colnames(MAX)<-c("YEAR","RN","DATE","NOM","SITE","LONG","SP","SUMNB","NB100" )
head(do.call(rbind, by(AGG100, AGG100[c("YEAR","SITE")], FUN = function(x) {
splist<-unique(x$SP)
lsp<-length(splist)
for (i in 1:lsp){
MIN$SP[i]<-as.character(splist[i])
MIN$SITE[i]<-as.character(unique(x$SITE))
MIN$DATE[i]<-as.character(min(x$DATE) - 7)
MIN$RN[i]<-as.character(unique(x$RN))
MIN$YEAR[i]<-as.character(unique(x$YEAR))
MIN$NOM[i]<-as.character(unique(x$NOM))
MIN$LONG[i]<-as.numeric(unique(x$LONG))
MIN$SUMNB[i]<-0
MIN$NB100[i]<-0
MAX$SP[i]<-as.character(splist[i])
MAX$SITE[i]<-as.character(unique(x$SITE))
MAX$DATE[i]<-as.character(min(x$DATE) + 7)
MAX$RN[i]<-as.character(unique(x$RN))
MAX$YEAR[i]<-as.character(unique(x$YEAR))
MAX$NOM[i]<-as.character(unique(x$NOM))
MAX$LONG[i]<-as.numeric(unique(x$LONG))
MAX$SUMNB[i]<-0
MAX$NB100[i]<-0
MINMAX<- rbind(MIN,MAX)
MINMAX<-MINMAX[complete.cases(MINMAX),]
}
return(MINMAX)
})), n=50)
YEAR RN DATE NOM SITE LONG SP
1 2003 RNN027 2003-04-10 ESTAGNOL RNN027-Estagnol 01 540 Brintesia circe (Fabricius, 1775)
2 2003 RNN027 2003-04-10 ESTAGNOL RNN027-Estagnol 01 540 Carcharodus alceae (Esper, 1780)
3 2003 RNN027 2003-04-10 ESTAGNOL RNN027-Estagnol 01 540 Celastrina argiolus (Linnaeus, 1758)
4 2003 RNN027 2003-04-10 ESTAGNOL RNN027-Estagnol 01 540 Coenonympha dorus (Esper, 1782)
5 2003 RNN027 2003-04-10 ESTAGNOL RNN027-Estagnol 01 540 Coenonympha pamphilus (Linnaeus, 1758)
编辑 2:它现在正在工作,感谢您的帮助!
【问题讨论】:
标签: r