2016-10-25 5 views
-1

여러 해에 걸친 기후 변수 (일별 값)의 데이터 세트에서 정보를 추출하려고합니다. 눈의 유무는 데이터 세트에서 1과 0으로 코딩됩니다. 각 라인은 하루에 해당하며 날짜와 반년 동안 컬럼 Cody가 있습니다. 각 반년기 동안 나는 눈의 존재가 마지막으로 나타난 후 날짜의 값을 찾으려고합니다 (1). 필자는 집계를 통해 변수를 그룹화하여이 작업을 시도했지만 "집계"는 이름이없는 데이터 프레임의 열을 전달하는 것처럼 보이기 때문에 사용자 지정 함수를 사용하지 못했습니다."집계"와 사용자 정의 함수의 결합

dates<-c("1993-01-01","1993-01-02","1993-01-03","1993-01-04","1993-01-05","1994-02-20","1994-02-21","1994-02-22","1994-02-23","1994-02-24") 
df<-data.frame(Date=as.Date(dates,format = "%Y-%m-%d"), 
       halves=as.factor(c(1993-01-01,1993-01-01,1993-01-01,1993-01-01,1993-01-01,1994-01-01,1994-01-01,1994-01-01,1994-01-01,1994-01-01)), 
       plot1=c(1,1,1,0,0,1,1,0,0,0), 
       plot2=c(1,1,0,0,0,1,1,0,1,0), 
       plot3=c(0,1,1,1,0,1,1,1,0,0)) 

나는 루프를 사용하여 그 효율이 아니라는 것을 알고 있지만 나는 "하지 플롯 - 열"에 함수를 적용하지 않도록 할 때부터 사용하고 있습니다 :

for(plots in names(df)[- which(names(df) %in% c("Date","halves"))]){   
    meltday[[plots<-aggregate(df[[plots]]~halves,df,df$Date[last(which(snow.days.half$Date==0)) + 1]) 
} 

이이 오류가 발생합니다 마지막 부분은 함수로 평가되지 않기 때문입니다. 그래서 집에서 만든 함수를 사용하여 모든 플롯 열에서 마지막 발생 일의 날짜 + 1을 찾습니다. 함수가 목록에 입력을 강제 변환하기 때문에

snowmelt<-function(x) 
{snowmelt<-max(x[[Date]][x[[plots]]==1]) 
snowmelt} 

그러나

for(plots in names(df)[- which(names(df) %in% c("Date","halves"))]){   
    meltday[[plots]]<-aggregate(df[[plots]] ~ halves,df,snowmelt) 
} 

시도는 오류 문으로 저를 떠났다.

그래서 나는 아주 꼼짝 못하고 올바른 방향으로 나를 가리키는 의견이나 대답에 대해 매우 감사하고 apprechiative하게 될 것입니다. 내 원하는 출력은의 날짜와 dataframe 될 것이다 :

>meltday 
    halves   plot1  plot2   plot3 
    1993-01-04  1993-01-04 1993-01-03 1993-01-05 
    1994-01-01  1994-02-22 1994-02-24 1994-02-23 

편집의 라인을 따라 : 명확한 설명을 위해 추가 원하는 출력.

감사합니다! tidyr 내가 너희를 입력 OP에서 halves 변수가 문자 벡터를 사용하는 방법을 변경

dplyr를 사용

+0

당신이 plyr, dplyr 또는 data.table에 대한 선호가 있습니까? 그것들은이 작업을 수행하는 데 도움이 될 수있는 세 가지 패키지입니다. – stephematician

+0

나는이 문제에서 dplyr로 뭔가를 시도했지만 아무 것도 관리하지 않았다. - : df %> % group_by (halves) %> % mutate (Snow.Melt = Date [last (which (df [[ ]] == 0)) + 1])'- – Ronja

+1

원하는 출력은 어떻게 보이나요? –

답변

1

dates<-c("1993-01-01","1993-01-02","1993-01-03","1993-01-04","1993-01-05","1994-02-20","1994-02-21","1994-02-22","1994-02-23","1994-02-24") 
df<-data.frame(Date=as.Date(dates,format = "%Y-%m-%d"), 
       halves=as.factor(c('1993-01-01','1993-01-01','1993-01-01','1993-01-01','1993-01-01','1994-01-01','1994-01-01','1994-01-01','1994-01-01','1994-01-01')), 
       plot1=c(1,1,1,0,0,1,1,0,0,0), 
       plot2=c(1,1,0,0,0,1,1,0,1,0), 
       plot3=c(0,1,1,1,0,1,1,1,0,0)) 

그럼 내가 사용하는 (그 버그 있었던 것 같아요) gather 명령을 사용하여 데이터를 긴 형식으로 바꾼 다음 summarise 함수가 각각 plot에 대해 집계 할 수있는 그룹화 된 데이터 프레임으로 바뀝니다. 나는 spread을 사용하여 데이터를 와이드 포맷으로 되돌려 놓았다.

df %>% 
gather(plot, snow, plot1:plot3) %>% 
group_by(plot, halves) %>% 
arrange(Date) %>% 
summarise(meltday=Date[max(which(snow==T))+1]) %>% 
spread(plot, meltday) 

출력

# A tibble: 2 × 4 
     halves  plot1  plot2  plot3 
*  <fctr>  <date>  <date>  <date> 
1 1993-01-01 1993-01-04 1993-01-03 1993-01-05 
2 1994-01-01 1994-02-22 1994-02-24 1994-02-23 

주 경우 : meltday가 발생하지 않은 경우에이 에러를 가질 것이다 (즉, 최종 엔트리가 눈). 나는 아직 '마지막'눈이 내리는 날을 감지하는 깔끔한 방법을 생각하지 못했습니다.

library(dplyr) 
res <- df %>% group_by(halves) %>% 
       summarize_each(funs(date=date.after.last.snow(.,Date)),-Date) 

결과 :

date.after.last.snow <- function(x, Date) { 
    Date[tail(which(x==1),1)+1] 
} 

그런 다음 각 plotgroup_byhalves을 요약하기 위해이 기능을 사용

+0

대단히 감사합니다! 하나의 질문이 더 있습니다. 어떻게하면 데이터 프레임으로'spread (plot, meltdate) '결과를 출력 할 수 있습니까? – Ronja

+0

마지막에'%> % as.data.frame()'을 추가 할 수 있습니다. 위의 코드는 예를 들어 할당으로 사용할 수 있습니다. 'meltday_df <- df %> % ... (나머지)' – stephematician

1

또 다른 방법은 마지막 눈이 하루 후 Date을 계산하기 위해 다음 함수를 정의하는 것입니다 귀하의 데이터를 사용하는 것이 예상대로입니다 :

print(res) 
### A tibble: 2 x 4 
##  halves plot1_date plot2_date plot3_date 
##  <fctr>  <date>  <date>  <date> 
##1 1993-01-01 1993-01-04 1993-01-03 1993-01-05 
##2 1994-01-01 1994-02-22 1994-02-24 1994-02-23 

데이터 :

df <- structure(list(Date = structure(c(8401, 8402, 8403, 8404, 8405, 
8816, 8817, 8818, 8819, 8820), class = "Date"), halves = structure(c(1L, 
1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L), .Label = c("1993-01-01", 
"1994-01-01"), class = "factor"), plot1 = c(1, 1, 1, 0, 0, 1, 
1, 0, 0, 0), plot2 = c(1, 1, 0, 0, 0, 1, 1, 0, 1, 0), plot3 = c(0, 
1, 1, 1, 0, 1, 1, 1, 0, 0)), .Names = c("Date", "halves", "plot1", 
"plot2", "plot3"), row.names = c(NA, -10L), class = "data.frame") 
##   Date  halves plot1 plot2 plot3 
##1 1993-01-01 1993-01-01  1  1  0 
##2 1993-01-02 1993-01-01  1  1  1 
##3 1993-01-03 1993-01-01  1  0  1 
##4 1993-01-04 1993-01-01  0  0  1 
##5 1993-01-05 1993-01-01  0  0  0 
##6 1994-02-20 1994-01-01  1  1  1 
##7 1994-02-21 1994-01-01  1  1  1 
##8 1994-02-22 1994-01-01  0  0  1 
##9 1994-02-23 1994-01-01  0  1  0 
##10 1994-02-24 1994-01-01  0  0  0 
+0

나는'summarise_each()'에 대해 잊고있다. – stephematician

관련 문제