我尝试将某些代码转换为使用data.table
。在这种情况下,我需要从data.frame / data.table中的列创建图形结构,其中行包含包含树中id和深度的信息。我的常规方法是拆分/应用/组合,所以我觉得应该可以使用by
和data.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)
我认为我遇到的问题是当我做by=level
时,我需要两个级别的信息才能获得正确的重复长度。
答案 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