한 열의 현재 값과 다른 열의 이전 값에서 계산 된 data.table에 새 열을 만들고 싶습니다. 이전 행에 액세스 할 수 있습니까?
예 :
> DT <- data.table(A=1:5, B=1:5*10, C=1:5*100)
> DT
A B C
1: 1 10 100
2: 2 20 200
3: 3 30 300
4: 4 40 400
5: 5 50 500
> DT[, D := C + BPreviousRow] # What is the correct code here?
정답은
> DT
A B C D
1: 1 10 100 NA
2: 2 20 200 210
3: 3 30 300 320
4: 4 40 400 430
5: 5 50 500 540
답변
v1.9.6 에서 shift()
구현 하면 이것은 매우 간단합니다.
DT[ , D := C + shift(B, 1L, type="lag")]
# or equivalently, in this case,
DT[ , D := C + shift(B)]
에서 뉴스 :
- 새로운 기능의
shift()
빠른 구현lead/lag
의 벡터 , 리스트 , data.frames 또는 data.tables . “lag” (기본값) 또는 “lead”type
중 하나 일 수 있는 인수를 사용 합니다. 그것은과 함께 매우 편리한 사용 가능 또는 . 예 : . 더 많은 정보 를 위해 봐주세요 .:=
set()
DT[, (cols) := shift(.SD, 1L), by=id]
?shift
이전 답변에 대한 기록을 참조하십시오.
답변
사용하면 dplyr
다음을 수행 할 수 있습니다.
mutate(DT, D = lag(B) + C)
다음을 제공합니다.
# A B C D
#1: 1 10 100 NA
#2: 2 20 200 210
#3: 3 30 300 320
#4: 4 40 400 430
#5: 5 50 500 540
답변
몇몇 사람들이 구체적인 질문에 답했습니다. 도움이 될 수있는 이와 같은 상황에서 사용하는 범용 함수는 아래 코드를 참조하십시오. 이전 행을 가져 오는 대신 “과거”또는 “미래”에서 원하는만큼 많은 행으로 이동할 수 있습니다.
rowShift <- function(x, shiftLen = 1L) {
r <- (1L + shiftLen):(length(x) + shiftLen)
r[r<1] <- NA
return(x[r])
}
# Create column D by adding column C and the value from the previous row of column B:
DT[, D := C + rowShift(B,-1)]
# Get the Old Faithul eruption length from two events ago, and three events in the future:
as.data.table(faithful)[1:5,list(eruptLengthCurrent=eruptions,
eruptLengthTwoPrior=rowShift(eruptions,-2),
eruptLengthThreeFuture=rowShift(eruptions,3))]
## eruptLengthCurrent eruptLengthTwoPrior eruptLengthThreeFuture
##1: 3.600 NA 2.283
##2: 1.800 NA 4.533
##3: 3.333 3.600 NA
##4: 2.283 1.800 NA
##5: 4.533 3.333 NA
답변
위의 @Steve Lianoglou의 의견에 따라 다음과 같은 이유가 있습니다.
DT[, D:= C + c(NA, B[.I - 1]) ]
# A B C D
# 1: 1 10 100 NA
# 2: 2 20 200 210
# 3: 3 30 300 320
# 4: 4 40 400 430
# 5: 5 50 500 540
seq_len
또는 head
또는 다른 기능을 사용하지 마십시오 .
답변
Arun의 솔루션에 따라 다음을 참조하지 않고도 유사한 결과를 얻을 수 있습니다. .N
> DT[, D := C + c(NA, head(B, -1))][]
A B C D
1: 1 10 100 NA
2: 2 20 200 210
3: 3 30 300 320
4: 4 40 400 430
5: 5 50 500 540
답변
패딩 인수를 추가하고 일부 이름을 변경하여 shift
. https://github.com/geneorama/geneorama/blob/master/R/shift.R
답변
내 직관적 인 솔루션은 다음과 같습니다.
#create data frame
df <- data.frame(A=1:5, B=seq(10,50,10), C=seq(100,500, 100))`
#subtract the shift from num rows
shift <- 1 #in this case the shift is 1
invshift <- nrow(df) - shift
#Now create the new column
df$D <- c(NA, head(df$B, invshift)+tail(df$C, invshift))`
여기서 invshift
행 수에서 1을 뺀 값은 4 nrow(df)
입니다. 데이터 프레임이나 벡터의 행 수를 제공합니다. 마찬가지로 이전 값을 가져 오려면 nrow 2, 3, … etc에서 빼고 그에 따라 NA를 처음에 넣으십시오.