df라는 데이터 세트가 있고이 데이터 세트가 year와 x1이라는 두 개의 변수로 구성되어 있다고 가정 해보십시오.
year <- c(2000, 2001, 2002, 2003, 2004)
x1 <- c(7, 8, 6, 3, 3)
df <- data.frame(year, x1)
내 임무는 x1에서 두 개의 새로운 변수를 계산하는 것입니다. 첫 번째 변수는 cSum으로, 지난 2 년 동안 x1 값의 합계를 반영해야합니다. 두 번째 변수는 cMax로, 지난 3 년 동안 x1에 대한 가장 높은 값을 반영해야합니다.
결과는 다음과 같아야합니다.
year x1 cSum cMax
2000 7
2001 8 15
2002 6 14 8
2003 3 9 8
2004 3 6 6
위의 cSum 및 cMax 변수를 어떻게 계산할 수 있습니까?
감사!
사용 data.table
:
library(data.table)
setDT(df)
첫째, 복잡한 방법입니다. 이후 transpose
최적화되어,이 수 빠르게 (안된) 수 :
df[ , cSum := transpose(lapply(transpose(shift(x1, 0:1)), sum))]
df[ , cMax := transpose(lapply(transpose(shift(x1, 0:2)), max))]
shift
본질적으로 지연 연산자입니다. cMax
현재 및 이전 1 (또는 2) 기간을 가져 오기 위해 시차 0, 1 및 (for ) 2를 원합니다 .
또는 :
df[ , cSum := rowSums(do.call(cbind, shift(x1, 0:1)))]
df[ , cMax := do.call(pmax, shift(x1, 0:2))]
둘 다 동일한 출력을 제공합니다.
df
# year x1 cSum cMax
# 1: 2000 7 NA NA
# 2: 2001 8 15 NA
# 3: 2002 6 14 8
# 4: 2003 3 9 8
# 5: 2004 3 6 6
이것을 지저분하게 만드는 것은 shift
하나 이상의 지연을 반환 할 때 a를 반환한다는 것입니다 list
. 하지만 불행히도이 목록은 우리가 필요로하는 것의 전치입니다 (행 방식 연산을 수행하고 있으며 열 친화적 인 방식으로 생성됨). 첫 번째 옵션 transpose
은 목록을보다 관리하기 쉬운 형식으로 만든 다음 열 transpose
형식으로 돌아 가기 전에 행 단위 연산을 수행 합니다.
두 번째 옵션은 출력을 배열로 변환하고 배열에 대해 행 단위 연산을 수행합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다