2017-12-04 4 views
1

저는 매우 큰 데이터 프레임과 특정 계수에 적용 할 조정 계수를 가지고 있습니다. 각 계수는 하나의 계수에만 적용됩니다. 1 년. 아래 코드는 각 행에 대해 올바른 계수를 선택하고 dat을 영향을받지 않은 연도에 포함하고 dat에 해당 계수를 곱하여 dat을 대체하는 벡터를 반환합니다. 내가이 일을 얻는 경우에dplyr : 돌연변이 내부 함수는 현재 행에서 열의 요소를 찾을 수 있습니까?

year <- rep(1:5, times = c(2,2,2,2,2)) 
dat <- 1:10 
df <- tibble(year, dat) 
adjust = c(rep(0, 4), rep(c(1 + 0.1*1:3), c(2,2,2))) 
df %>% mutate(dat = ifelse(year < 5, year, dat*adjust[[year - 2]])) 

, 나는 다음과 같은 오류 얻을 :이 꽤 확신

Evaluation error: attempt to select more than one element in vectorIndex. 

을 추출 연산자 때문에 전체 벡터 년보다는 올해로 [[ 취급 year 현재 행이 있으므로 벡터화 된 뺄셈이 있습니다. [[은 벡터 값 인덱스에서 질식합니다.

나는이 문제를 해결할 수있는 많은 방법이 있음을 알고 있습니다. 나는 지금 일하는 중첩 된 ifelse를 포함하여 특히 추악한 방법을 가지고있다. 제 질문은, 제가 R과 dplyr-idiomatic 방식으로하려는 것을 할 수있는 방법이 있습니까? 우리가 행이나 행 그룹을 별개의 엔티티로 취급하기를 원하기 때문에 어떤면에서는 필터 또는 group_by 문제처럼 보일지 모르겠지만 그렇게하는 방법을 찾지 못했습니다.

전체 벡터의 결과가 아닌 행 단위로 정의하거나 생각하기 쉬운 몇 가지 기능이있는 것처럼 보입니다. 나는 각 연도에 대한 정확한 조정을 포함하는 단일 벡터를 생성 할 수 있지만, 연간 행 수가 다양하기 때문에 그 벡터를 구성하기 위해 다중 값 조건 테스트를 적용해야하므로 동일한 문제가 발생합니다.

그렇지 않습니까?

+1

어떻게'adjust' year''에 매핑합니까? 당신은 5 년이 지났지 만 세가지'조정 '가치 만 있습니다. – Psidom

+0

년 년보다 작년에 매핑 - 실제로, 3 미만이 아닙니다. 2. 해결하도록하겠습니다. – andrewH

답변

2

벡터 인덱싱에는 [[ 대신 [을 사용해야합니다. 그리고 또한 year - 2는 더 많은 문제를 일으키는 음의 지표를 생성합니다. 당신이 인덱스 위치에 의해 adjustyear을 매핑 할 경우, year을 나타내는 maskreplace를 사용하여 수정할 수 :

df %>% 
    mutate(dat = { 
     mask = year > 2; 
     replace(year, mask, dat[mask] * adjust[year[mask] - 2]) 
    }) 
# A tibble: 10 x 2 
# year1 dat1 
# <int> <dbl> 
# 1  1 1.0 
# 2  1 1.0 
# 3  2 2.0 
# 4  2 2.0 
# 5  3 5.5 
# 6  3 6.6 
# 7  4 8.4 
# 8  4 9.6 
# 9  5 11.7 
#10  5 13.0 
+0

감사합니다 Psidom! 그 기능을 대체하는 것은 매우 편리합니다. 이전에 건너 가지 않았다는 사실에 놀랐습니다. 난 그냥 left_join을 사용하여 비슷한 것을 쓰려고했다. 내가 그 주위를 돌아 다녔다면 보장 할 수는 없지만, 나는 서로 벤치마킹하고 결과를 게시 할 것입니다. – andrewH

관련 문제