대안

2016-07-09 4 views
2

내가 가지고있는 다음과 같은 데이터 프레임 실제 데이터 프레임은 다음과 같습니다대안

structure(list(FY = c("2015-2016", "2015-2016", "2015-2016", 
"2015-2016"), YEARMN = structure(c(2015.25, 2015.25, 2015.25, 
2015.25), class = "yearmon"), BRAND = c("3M CAR CARE", "CAR CARE 3M", 
"CAR CARE 3M", "CAR CARE 3M"), variable = structure(c(1L, 
2L, 3L, 4L), .Label = c("IstWEEKRent", "IIndWEEKRent", "IIIrdWEEKRent", 
"IVthWEEKRent", "mymonth"), class = "factor"), value = c("0", 
"17500", "85000", "212500"), mymonth = c("Apr", "Apr", "Apr", 
"Apr")), .Names = c("FY", "YEARMN", "BRAND", "variable", "value", 
"mymonth"), row.names = c(NA, 4L), class = "data.frame") 

:

  FY YEARMN  BRAND  variable value mymonth 
1 2015-2016 Apr 2015 3M CAR CARE IstWEEKRent  0  Apr 
2 2015-2016 Apr 2015 CAR CARE 3M IIndWEEKRent 17500  Apr 
3 2015-2016 Apr 2015 CAR CARE 3M IIIrdWEEKRent 85000  Apr 
4 2015-2016 Apr 2015 CAR CARE 3M IVthWEEKRent 212500  Apr 

내 달 열 사월에서 달이있다 3 월 ... 그리고 매월 내 데이터 세트에서 4 주를 변수 column에 제공합니다. 나는 회계 연도 4월의 주 번호를 만들려고하고 있어요 - 월을 1에서 48으로 시작 내가 ifelse이 완수하는 기능을 사용

variable == "IstWeekRent" & mymonth == "Apr" 

조건을 일치하는 주 번호 하나를주고 싶어 ... 이는 잘 작동 ...하지만 난 내 반짝 응용 프로그램 나는 다음과 같은 오류가 점점 오전에 동일하게 포함 할 때 :

Error in parse(file, keep.source = FALSE, srcfile = src, encoding = enc) : 
    contextstack overflow at line 2870 

나의 현재 ifelse 조건 문은 다음과 같습니다

trndR$weeks <- ifelse(trndR$mymonth == "Apr" & trndR$variable == "IstWEEKRent", 1, 
       ifelse(trndR$mymonth == "Apr" & trndR$variable == "IIndWEEKRent", 2, 
       ifelse(trndR$mymonth == "Apr" & trndR$variable == "IIIrdWEEKRent", 3, 
       ifelse(trndR$mymonth == "Apr" & trndR$variable == "IVthWEEKRent", 4, 
       ifelse(trndR$mymonth == "May" & trndR$variable == "IstWEEKRent", 5, 
       ifelse(trndR$mymonth == "May" & trndR$variable == "IIndWEEKRent", 6, 

을은 나의 df의 이름이고 조건은 최대 48 개까지 확장됩니다.

나는 50 개까지 중첩 된 ifelse 조건을 가질 수 있다고 알았습니다 ... 그러나 이것을 교정하는 방법을 확실히 알지 못합니다. 적용 함수에 대해서는 읽었지만이 경우에는 사용법을 모른다.

+0

데이터가 정렬되어 있습니까? 표시 한 데이터는 주당 일관된 1 행이있는 것처럼 보입니다.이 경우 행 번호가'weeks' 열에 충분할 것입니다. – rosscova

답변

2

1) 시험해보기 :

질문에 게시이 사용 trndR 제공
mos <- month.abb[c(4:12, 1:3)] # Apr, May, ...., Dec, Jan, Feb, Mar 
transform(trndR, weeks = 4 * (match(mymonth, mos)-1) + as.numeric(variable)) 

: 행이 정렬 누락 주이 있어도되지 않은 경우에도이 작동합니다

  FY YEARMN  BRAND  variable value mymonth weeks 
1 2015-2016 2015.25 3M CAR CARE IstWEEKRent  0  Apr  1 
2 2015-2016 2015.25 CAR CARE 3M IIndWEEKRent 17500  Apr  2 
3 2015-2016 2015.25 CAR CARE 3M IIIrdWEEKRent 85000  Apr  3 
4 2015-2016 2015.25 CAR CARE 3M IVthWEEKRent 212500  Apr  4 

.

1A)이 대안은 짧은 (하나 개의 라인입니다)하지만, 아마도 분명하지 : 행이 정렬 및 누락 된 주이없는 경우

transform(trndR, weeks = 4*((match(mymonth, month.abb)-4) %% 12) + as.numeric(variable)) 

2) 다음이로 일 것이다 잘

transform(trndR, weeks = 1:nrow(trndR)) 
+0

'as.numeric'은 문자열을 숫자로 변환합니까? 나는 그것이 가능할 수도 있음을 알 수 있지만, 나는 그것을 위해 일할 수 없다. – rosscova

+0

그들은 성격이 아닙니다. 그들은 요소입니다. 보십시오'str (trndR)' –

+0

아, 나는 그것을 알아 차리지 못했습니다! 문제를 훨씬 쉽게 만듭니다! 감사. – rosscova

1

데이터 모양에 따라 모든 순서가 올바른지 확인한 다음 각 행을 특정 주일에 호출 할 수 있어야합니다. 예를 들어 (G.Grothendieck 나에게 지적 후 그들의 대답은 나보다 더 깔끔한 보인다는 variable 열이 요인이라고 약간 편집 할 수 있지만 나는 그것이 어떤 관심의 경우에는 어쨌든 여기를 떠날거야)

# get a value from 1 to 4, representing the `variable` column numerically 
trndR$weeks <- as.numeric(trndR$variable) 

# now sort the dataframe by `YEARMN` and `weeks` respectively to make sure everything is in order 
trndR <- trndR[ with(trndR, order(YEARMN, weeks)), ] 

# and replace that new `weeks` column with a sequence 
trndR$weeks <- seq_along(trndR$weeks) 
데이터가 하나의 회계 연도 포함처럼

그것은 보이지만,하지 않을 경우, 당신은 (완전 데이터 집합에 표시되는 각 회계 연도 가정) 회계 연도마다 적용하려면 위의 마지막 줄을 다시 작성할 수 :

library(data.table) 
setDT(trndR)[ , weeks := seq_len(48), by = FY ] 
+0

많은 감사합니다 .... 나는 당신의 솔루션을 시도 ...그러나 seq_along은 1 주부터 4 주를 고려한 주 번호를 찾고있는 반면 1 주부터 1256 주까지 일련 번호로 주주를 채 웁니다. 다시 한번 많은 감사드립니다 ... 당신의 솔루션은 분명히 다른 해결책을 알게되었습니다 ..... 나는 지난 아침 이후로 어려움을 겪고있었습니다. 그리고 ifelse를 적용하기 전에 FY로 서브 세트 작업을 진행했습니다. – Apricot

+1

마지막 섹션 ('data.table'과 함께)을 사용 했습니까? 그것은 당신이 이야기하고있는 긴 순서를 피해야합니다. 어쨌든 해결책을 찾은 것을 기쁘게 생각합니다. – rosscova