答案 0 :(得分:4)
您可能需要查看包igraph
。
在使用之前,您需要更改NA
,我假设您不能让来自同一家庭的2个人使用NA。
所以:
roots <- family[is.na(family)] <- seq(sum(is.na(family)))
然后你创建一个图形(具有不同的连接),第一列需要是父亲:
library(igraph)
family_tree <- graph_from_data_frame(family[, 2:1])
你可以看到它:
plot(family_tree)
然后,您可以使用distances
计算级别和系列到root:
tab_roots <- sapply(roots, function(root) distances(family_tree, family$person, root))
你必须要家庭data.frame:
family$level <- apply(tab_roots, 1, min)
family$family <- apply(tab_roots, 1, function(d) which(d!=Inf))
family # person father level family #1 Guillou Arthur 1 1 1 #2 Cleach Marc 2 1 2 #3 Guillou Eric Guillou Arthur 2 1 #4 Guillou Jacques Guillou Arthur 2 1 #5 Cleach Franck Cleach Marc 2 2 #6 Cleach Leo Cleach Marc 2 2 #7 Cleach Herbet Cleach Leo 3 2 #8 Cleach Adele Cleach Herbet 4 2 #9 Guillou Jean Guillou Eric 3 1 #10 Guillou Alan Guillou Eric 3 1