data.table 구문을 사용하여 원래의 data.table 열과 다음 열의 차이점이있는 data.table을 어떻게 만들 수 있습니까?data.table에서 열 단위 차이 가져 오기
예 : I는 각 행의 그룹 인 data.table을 가지며, 각 컬럼은 이와 같이 등 년 1,2 후 0 년 후 인구 살아남은 :
pop <- data.table(group_id = c(1, 2, 3),
N = c(4588L, 4589L, 4589L),
N_surv_1 = c(4213, 4243, 4264),
N_surv_2 = c(3703, 3766, 3820),
N_surv_3 = c(2953, 3054, 3159))
# group_id N N_surv_1 N_surv_2 N_surv_3
# 1 4588 4213 3703 2953
# 2 4589 4243 3766 3054
# 3 4589 4264 3820 3159
(N 진정한 정수 수와 N_surv_1 등 소수가 될 수 전망입니다 때문에 데이터 유형이 다를 수)
내가 무슨 짓을 :.은 기본 diff
및 매트릭스 전위를 사용하여, 우리는 할 수 있습니다
diff <- data.table(t(diff(t(as.matrix(pop[,-1,with=FALSE])))))
setnames(diff, paste0("deaths_",1:ncol(diff)))
cbind(group_id = pop[,group_id],diff)
# produces desired output:
# group_id deaths_1 deaths_2 deaths_3
# 1 -375 -510 -750
# 2 -346 -477 -712
# 3 -325 -444 -661
은 내가 melt.data.table
에 의해 생성 된 단일 컬럼에 그룹에 의해 기본 diff
를 사용할 수 있다는 것을 알고, 그래서 이것은 작동하지만 꽤되지 않습니다 :
melt(pop,
id.vars = "group_id"
)[order(group_id)][, setNames(as.list(diff(value)),
paste0("deaths_",1:(ncol(pop)-2))),
keyby = group_id]
은 그게 가장 data.table - riffic 방식 이 작업을 수행하거나 data.table에서 다중 열 작업으로 처리하는 방법이 있습니까?
흥미롭게도 용융 속도가 느리지 만 놀라운 것은 아닙니다. 나는 여전히 데이터를 저장하는 "올바른"방법이라고 주장 할 것입니다. 즉, 각 그룹에 대한 모집단 측정 순서를 캡처하는 "시간"열이있는 긴 형식이어야합니다. 나는 akrun의 해결책을 추측하고있다. (내 대답은 :'pop [, .SD [, -1, = FALSE] - .SD [, -ncol (.SD), = FALSE], .SDcols = ncols]')도 상당히 빠릅니다. – Frank