data.table版本的拆分和重复

时间:2015-11-09 17:07:52

标签: r data.table

我尝试将某些代码转换为使用data.table。在这种情况下,我需要从data.frame / data.table中的列创建图形结构,其中行包含包含树中id和深度的信息。我的常规方法是拆分/应用/组合,所以我觉得应该可以使用bydata.table中的一些表达式,但我无法得到它。

这是一个例子,

## A data.table like this with ids and levels
dat <- data.table(level = rep(1:4, times=2^(0:3)), id = 1:15)

## my normal way, not using data table would involve a split and rep
levs <- split(dat$id, dat$level)
nodes <- unlist(mapply(function(a,b) rep(a, length.out=b), head(levs, -1L),
                       tail(lengths(levs), -1L)), use.names = FALSE)

## Desired result
res <- cbind(nodes, dat$id[-1L])

## To visualize
library(igraph)
plot(graph_from_edgelist(cbind(nodes, dat$id[-1L])), layout=layout.reingold.tilford,
     asp=0.6)

enter image description here

修改

我认为我遇到的问题是当我做by=level时,我需要两个级别的信息才能获得正确的重复长度。

1 个答案:

答案 0 :(得分:4)

以下是获取nodes列的另一种方式:

dat[, .N, by = .(level = level - 1)][
    dat, on = 'level', nomatch = 0][
    , .(nodes = rep(id, length.out = N[1])), by = level]
#    level nodes
# 1:     1     1
# 2:     1     1
# 3:     2     2
# 4:     2     3
# 5:     2     2
# 6:     2     3
# 7:     3     4
# 8:     3     5
# 9:     3     6
#10:     3     7
#11:     3     4
#12:     3     5
#13:     3     6
#14:     3     7