현재 종족 존재 지수를 계산하려고하고 있는데 do.call 명령으로 조금 붙어 있습니다.do.call 및 multiple function (x)
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
내 인덱스를, 내가 모든 사이트/년 조합을 분리하고 (이를 편집 할 첫 번째와 마지막 날을 뺀해야 계산하기 위해 플러스 7 :
은 내가 DF는 다음과 같이 구축 일).나는 다음과 같은 명령으로 (완료하기 때문에 작동하지 않는) 것을 할 수 있어야한다 :
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의 모든 조합 전후에 추가하십시오. 요점은 모든 종의 합계에 대한 사이트 당 첫 번째 및 마지막 관찰 날짜를 감지하고, 원하는대로 수정 한 다음, 각 종의 시간 재분할에서 추가합니다 (각 "덩어리"에 두 개의 새로운 행이 있음).
다음 코드를 사용하여 모든 "청크"앞뒤에 행을 추가 할 수 있습니다 (행은 현재 기반이며 처음과 마지막 날짜가 아니라 원하는 날짜 임).
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/년/SP) 내 첫 번째 명령의 날짜 (SITE/년)를 포함하는 행을 추가하려면 다음 두 명령을 연결 할 수있는 방법이다. 내 function (x) 명령과 다른 do.call 명령에 루프를 추가하려고 시도했지만 작동하지 않았습니다.
편집 :
@Troy : 어제, 내가 성공적으로 내 do.call 명령에 루프를 추가 : 내 목표는 상관없이 종의 모든 사이트/년 조합을 부분 집합했다. 각 하위 집합에서 나는 종의 합계에 대한 시간 분포의 두 가지 한계를 취합니다 (그 정보가 없으므로). 그런 다음 하위 집합에 수집 된 정보로 각 종에 대한 행을 씁니다. 여기 내 루프는 최소 및 최대 날짜가있는 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 : 이제 도움이되었습니다. plyr
사용하여이 약
그것은 아니다 정확히 내가 원하는 것. 예를 들어, 첫 번째 사이트와 첫 해에 27 종의 종들이 관찰되었다 (ESTAGNOL, 2003, 내 DF에서 보임). 귀하의 명령은 좋은 날짜를 감지하지만이 날짜에 관찰 된 종과 병합합니다.이 예제는 단지 3 종이므로 27 대신 3 분의 행이 필요합니다. 매 해마다 2 개의 새로운 행 (최소 및 최대 날짜 포함)을 추가해야합니다./SITE/SP 조합. 병합은이 생각에 맞지 않습니다. – user2542995
안녕하세요 @ user2542995 - SP로도 격리하려는 경우 최소 및 최대 행을 만드는'ddply()'호출을 변경하는 것입니다. 두 번째 인수는'. (YEAR, (YEAR, SITE, SP)'(귀하의 질문을 잘못 읽었을 때의 실수) – Troy
답변은 위의 수정에 따라 – Troy