data.tableの構文を使って、元のdata.tableの列と次の列の違いが各列に含まれているdata.tableを作成するにはどうすればよいですか?data.tableの列方向の違いを取る
例:等、私は、各行が基data.tableを有し、各列は1年後、年間0後の集団を生存され、2のような:
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