2013-12-11 1 views
1

현재 종족 존재 지수를 계산하려고하고 있는데 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 사용하여이 약

답변

1

방법 - 당신의 나머지 열 6-10 항상 DATE/사이트의 모든 조합에 대해 같은 경우 PS는, 다음이 더 단순화 할 수있다 (merge() 필요 없음)

require(plyr) 

sp<-read.csv("sp.csv") 
sp<-sp[,2:10] #(take out the ID numbers from csv) 

mins<-ddply(sp,.(YEAR,SITE,SP),summarise,DATE=min(DATE)) 
mins<-merge(sp,mins,by=c("YEAR","SITE","DATE")) 
mins$DATE<-mins$DATE-7 

maxs<-ddply(sp,.(YEAR,SITE,SP),summarise,DATE=max(DATE)) 
maxs<-merge(sp,maxs,by=c("YEAR","SITE","DATE")) 
maxs$DATE<-maxs$DATE+7 

sp.new<-rbind(mins,sp,maxs) 
sp.new[order(sp.new$DATE),] 

    YEAR   SITE DATE  RN  NOM LONG          SP SUMNB  NB100 
1 2003 RNN027-Estagnol 12159 RNN027 ESTAGNOL 03 330 Anthocharis cardamines (Linnaeus,1758)  2 0.6060606 
7 2003 RNN027-Estagnol 12166 RNN027 ESTAGNOL 03 330 Anthocharis cardamines (Linnaeus,1758)  2 0.6060606 
12 2003 RNN027-Estagnol 12173 RNN027 ESTAGNOL 03 330 Anthocharis cardamines (Linnaeus,1758)  2 0.6060606 
2 2005 RNN027-Estagnol 12888 RNN027 ESTAGNOL 01 540 Anthocharis cardamines (Linnaeus,1758)  2 0.3703704 
10 2005 RNN027-Estagnol 12895 RNN027 ESTAGNOL 01 540 Anthocharis cardamines (Linnaeus,1758)  2 0.3703704 
11 2005 RNN027-Estagnol 12910 RNN027 ESTAGNOL 01 540 Anthocharis cardamines (Linnaeus,1758)  2 0.3703704 
13 2005 RNN027-Estagnol 12917 RNN027 ESTAGNOL 01 540 Anthocharis cardamines (Linnaeus,1758)  2 0.3703704 
3 2006 RNN027-Estagnol 13245 RNN027 ESTAGNOL 03 330 Anthocharis cardamines (Linnaeus,1758)  2 0.6060606 
8 2006 RNN027-Estagnol 13252 RNN027 ESTAGNOL 03 330 Anthocharis cardamines (Linnaeus,1758)  2 0.6060606 
9 2006 RNN027-Estagnol 13257 RNN027 ESTAGNOL 03 330 Anthocharis cardamines (Linnaeus,1758)  2 0.6060606 
14 2006 RNN027-Estagnol 13264 RNN027 ESTAGNOL 03 330 Anthocharis cardamines (Linnaeus,1758)  2 0.6060606 
4 2011 RNN027-Estagnol 15049 RNN027 ESTAGNOL 02 310 Anthocharis cardamines (Linnaeus,1758)  1 0.3225806 
5 2011 RNN027-Estagnol 15056 RNN027 ESTAGNOL 02 310 Anthocharis cardamines (Linnaeus,1758)  1 0.3225806 
6 2011 RNN027-Estagnol 15075 RNN027 ESTAGNOL 02 310 Anthocharis cardamines (Linnaeus,1758)  1 0.3225806 
15 2011 RNN027-Estagnol 15082 RNN027 ESTAGNOL 02 310 Anthocharis cardamines (Linnaeus,1758)  1 0.3225806 
+0

그것은 아니다 정확히 내가 원하는 것. 예를 들어, 첫 번째 사이트와 첫 해에 27 종의 종들이 관찰되었다 (ESTAGNOL, 2003, 내 DF에서 보임). 귀하의 명령은 좋은 날짜를 감지하지만이 날짜에 관찰 된 종과 병합합니다.이 예제는 단지 3 종이므로 27 대신 3 분의 행이 필요합니다. 매 해마다 2 개의 새로운 행 (최소 및 최대 날짜 포함)을 추가해야합니다./SITE/SP 조합. 병합은이 생각에 맞지 않습니다. – user2542995

+0

안녕하세요 @ user2542995 - SP로도 격리하려는 경우 최소 및 최대 행을 만드는'ddply()'호출을 변경하는 것입니다. 두 번째 인수는'. (YEAR, (YEAR, SITE, SP)'(귀하의 질문을 잘못 읽었을 때의 실수) – Troy

+0

답변은 위의 수정에 따라 – Troy