R 通过减少数据表来排序

R 通过减少数据表来排序,r,join,data.table,R,Join,Data.table,其中第3行至第6行无法推断,并且foo是需要保留的其他变量的替身 例如,在data.table中,使用巧妙的连接组合可以有效地实现这一点吗 这个问题有点类似于一个问题,但我已经修改了情况,使它更清楚 在我看来,您需要图形算法的帮助。如果要从1002开始,可以尝试: > head(ans) id old new foo 1: 1 1002 1007 -0.7889534 2: 1 1007 1015 1.1397910 3: 1 1015 1022 -1

其中第3行至第6行无法推断,并且
foo
是需要保留的其他变量的替身

例如,在data.table中,使用巧妙的连接组合可以有效地实现这一点吗


这个问题有点类似于一个问题,但我已经修改了情况,使它更清楚

在我看来,您需要图形算法的帮助。如果要从
1002
开始,可以尝试:

> head(ans)
    id old  new        foo
1:   1 1002 1007 -0.7889534
2:   1 1007 1015  1.1397910
3:   1 1015 1022 -1.2193670
4:   1 1022 1024  1.2039050
5:   1 1024 1026  0.4388586
6:   2 1744 1750 -0.1368320

这个解决方案对我来说很有意义!不存在
t$id
,因为
t
对所有这些都有效,id只设置各自的起点。如果我不想手工操作,我如何将
id
放入其中?类似于
I[,t[old%in%subcomponent(g,start,“out”)],by=(id)]
Yes!但是是否可以将每个序列的数量限制为
n
?看起来这也需要在
t[old%in%…]
命令中完成。@bumblebee您只想返回第一行
n
行吗?是的,谢谢您将其添加到您的解决方案中。我将您的上一步
rbindlist(setNames(lappy(…))
与chinsoon12的建议
I[,t[…],by=(id)]
进行了比较,速度相当。谢谢你们两个!
> head(ans)
    id old  new        foo
1:   1 1002 1007 -0.7889534
2:   1 1007 1015  1.1397910
3:   1 1015 1022 -1.2193670
4:   1 1022 1024  1.2039050
5:   1 1024 1026  0.4388586
6:   2 1744 1750 -0.1368320
require(igraph)
g <- graph_from_edgelist(as.matrix(t[,1:2]))
t[old %in% subcomponent(g,"1002","out")]
#  1: 1002 1007 -0.78895338
#  2: 1007 1015  1.13979100
#  3: 1015 1022 -1.21936662
#  4: 1022 1024  1.20390482
#  5: 1024 1026  0.43885860
# ---                      
#191: 1981 1988 -0.22054875
#192: 1988 1989 -0.22812175
#193: 1989 1995 -0.04687776
#194: 1995 2000  2.41349730
#195: 2000 2002 -1.23425666
n <- 5
rbindlist(
    setNames(lapply(i$start, function(x) t[old %in% subcomponent(g,x,"out")[1:n]]), i$id),
    idcol="id")
#    id  old  new        foo
# 1:  1 1002 1007 -0.7889534
# 2:  1 1007 1015  1.1397910
# 3:  1 1015 1022 -1.2193666
# 4:  1 1022 1024  1.2039048
# 5:  1 1024 1026  0.4388586
# 6:  2 1744 1750 -0.1368320
# 7:  2 1750 1758  0.3331686
# 8:  2 1758 1763  1.3040357
# 9:  2 1763 1767 -1.1715528
#10:  2 1767 1775  0.2841251
#11:  3 1656 1659 -0.1556208
#12:  3 1659 1663  0.1663042
#13:  3 1663 1669  0.3781835
#14:  3 1669 1670  0.2760948
#15:  3 1670 1675  0.3745026