r - 通过减少data.table来排序

标签 r join data.table

require(data.table)    
set.seed(333)
t <- data.table(old=1002:2001, dif=sample(1:10,1000, replace=TRUE))
t$new <- t$old + t$dif; t$foo <- rnorm(1000); t$dif <- NULL
i <- data.table(id=1:3, start=sample(1000:1990,3))


> i
   id start
1:  1  1002
2:  2  1744
3:  3  1656

> head(t)
    old  new        foo
1: 1002 1007 -0.7889534
2: 1003 1004  0.3901869
3: 1004 1014  0.7907947
4: 1005 1011  2.0964612
5: 1006 1007  1.1834171
6: 1007 1015  1.1397910

我想从 points 中删除时间点这样只有那些行保留在 new[i] = old[i-1] ,给出一些固定数量的时间点的连续序列。理想情况下,这将对所有 id 进行。在 i同时,其中start给出起点。例如,如果我们选择 n=5 ,我们应该得到
> 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

其中第 3 行到第 6 行不能在上面和 foo 上推断出来是其他需要保留的变量的替代品。

这是否可以在 data.table 中有效地完成,例如,使用巧妙的连接组合?

附注。这个问题有点类似于 an earlier one of mine但我已经修改了情况以使其更清楚。

最佳答案

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

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

当然你可以为每个start做上面的您想要并限制第一个 n 的结果行。例如,我们可以 lapplyi$start位置然后rbindlist所有值放在一起,声明一个 id列与 i$id值。就像是:
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

关于r - 通过减少data.table来排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56938121/

相关文章:

r - R中的自动总是时间函数

roxygen2 不创建 .Rd 文档

php - 如果有的话,按照另一个表中出现的次数对 MySQL 表中的结果进行排序

没有任何匹配项的 MySql Join 表显示空值

r - 使用 `{data.table}` : how to name a new column? 编程

r - 在 mgcViz 图中结合多个簇的 gam 平滑

r - 如何正确地将NaN转换为NA

MySQL - 如何优化表 b 的附加字段到表 a 的查询

r - 访问数据表中的列表成员

r - 写入.csv : Error in charToDate(x) : character string is not in a standard unambiguous format