이 우아한 대답하지 않습니다에서 액세스 할 수 있습니다. 그러나 나는 내가 시도한 것을 떠나고 싶다. 먼저 데이터 프레임을 정렬했습니다. 각 연도의 주요 연도가 어느 연도인지 파악하고 싶었습니다. 그래서 id
을 만들었습니다. variable
은 원본 데이터 세트의 열 이름 (예 : pol_2000)에서 가져옵니다. entryYear
은 데이터에 entry
에서 온 것입니다. entryMonth
은 entry
에서도 제공됩니다. check
은 각 참가자의 기준 연도를 식별하기 위해 작성되었습니다. 다음 단계에서는 SOfun 패키지에 getMyRows
을 사용하여 각 참가자에 대해 6 개의 행을 추출했습니다. 다음 단계에서는 질문에 설명 된대로 lapply
을 사용하고 수학을 수행했습니다. 2 년 또는 5 년 평균 계산을 위해 총 가치를 2 년 또는 5 년으로 나누었습니다. 나는 최종 출력물이 어떻게 생겼는지 확신 할 수 없었다. 그래서 각 주제에 기본 연도를 사용하기로 결정하고 세 개의 열을 추가했습니다.
library(stringi)
library(SOfun)
devtools::install_github("hadley/tidyr")
library(tidyr)
library(dplyr)
### Big thanks to BondedDust for this function
### http://stackoverflow.com/questions/6987478/convert-a-month-abbreviation-to-a-numeric-month-in-r
mo2Num <- function(x) match(tolower(x), tolower(month.abb))
### Arrange the data frame.
ana <- foo %>%
mutate(id = 1:n()) %>%
melt(id.vars = c("id","entry")) %>%
arrange(id) %>%
mutate(variable = as.numeric(gsub("^.*_", "", variable)),
entryYear = as.numeric(stri_extract_last(entry, regex = "\\d+")),
entryMonth = mo2Num(substr(entry, 3,5)) - 1,
check = ifelse(variable == entryYear, "Y", "N"))
### Find a base year for each subject and get some parts of data for each participant.
indx <- which(ana$check == "Y")
bob <- getMyRows(ana, pattern = indx, -5:0)
### Get one-year average
cathy <- lapply(bob, function(x){
x$one <- ((x[6,6]/12) * x[6,4]) + (((12-x[5,6])/12) * x[5,4])
x
})
one <- unnest(lapply(cathy, `[`, i = 6, j = 8))
### Get two-year average
cathy <- lapply(bob, function(x){
x$two <- (((x[6,6]/12) * x[6,4]) + x[5,4] + (((12-x[4,6])/12) * x[4,4]))/2
x
})
two <- unnest(lapply(cathy, `[`, i = 6, j =8))
### Get five-year average
cathy <- lapply(bob, function(x){
x$five <- (((x[6,6]/12) * x[6,4]) + x[5,4] + x[4,4] + x[3,4] + x[2,4] + (((12-x[2,6])/12) * x[1,4]))/5
x
})
five <- unnest(lapply(cathy, `[`, i =6 , j =8))
### Combine the results with the key observations
final <- cbind(ana[which(ana$check == "Y"),], one, two, five)
colnames(final) <- c(names(ana), "one", "two", "five")
# id entry variable value entryYear entryMonth check one two five
#6 1 07feb2002 2002 18 2002 1 Y 18.916667 18.500000 18.766667
#14 2 06jun2002 2002 16 2002 5 Y 16.583333 16.791667 17.150000
#23 3 16apr2003 2003 14 2003 3 Y 15.500000 15.750000 16.050000
#31 4 26may2003 2003 16 2003 4 Y 16.666667 17.166667 17.400000
#39 5 11jun2003 2003 13 2003 5 Y 13.583333 14.083333 14.233333
#48 6 20feb2004 2004 3 2004 1 Y 3.000000 3.458333 3.783333
#56 7 25jul2004 2004 2 2004 6 Y 2.000000 2.250000 2.700000
#64 8 19aug2004 2004 4 2004 7 Y 4.000000 4.208333 4.683333
#72 9 19dec2004 2004 5 2004 11 Y 5.083333 5.458333 4.800000
내 요청 중 하나에 답변 해 주신 코드에 감사드립니다. 5 년 평균을 계산하는 코드에 작은 변화가있을 수 있습니다. (bob, function (x) { x $ 5 <- ((x [6,6]/12) * x [6, 0]) 다음과 같이 목록 "bob"에 행 1을 포함해야합니다 : cathy < 4]) + x [5,4] + x [4,4] + x [3,4] + x [2,4] + (((12-x [2,6] 1,4]))/5 x } 답변을 업데이트하십시오. 이 데이터에서 운영자를 지연시키는 방법에 대한 아이디어가 있습니까? – Meso
@Meso 의견을 보내 주셔서 감사합니다. 내가 언급 한 부분을 수정했습니다. 나는 '지연 (lag)'이 여기서 어떻게 작용할 지 생각할 필요가있다. 그러나, 나는 직관적으로 그것이 어떻게 든 올바른 접근이되지 않을 것이라고 생각합니다. 지금 귀하의 원본 데이터를 볼 수 있다면, 나는 여전히 당신이 각 과목의 기준 연도를 확인해야한다고 생각합니다. 그런 다음 특정 비율의 값을 얻으려면 어떤 값을 처리해야하는지 식별해야합니다. 내가 말하는 것은 내가 한 일의 변형이다. 행 현명한 연산보다는 열 단위 연산이 필요합니다. 지체와 함께 아이디어가 떠오르면 알려 드리겠습니다. – jazzurro