R 将data.table中的条件链接值分组

R 将data.table中的条件链接值分组,r,data.table,R,Data.table,我有一个data.table,其中有3列输入,如下所示,第四列表示我的目标输出: require(data.table) Test <- data.table(Created = c(5,9,13,15,19,23,27,31,39,42,49), Next_peak = c(9,15,15,23,27,27,31,39,49,49,50), Valid_reversal = c(T,T,F,F,T,F,T,F,T,F,F

我有一个data.table,其中有3列输入,如下所示,第四列表示我的目标输出:

require(data.table)
Test <- data.table(Created = c(5,9,13,15,19,23,27,31,39,42,49),
                 Next_peak = c(9,15,15,23,27,27,31,39,49,49,50),
                 Valid_reversal = c(T,T,F,F,T,F,T,F,T,F,F),
                 Target_output = c(5,5,13,5,19,23,19,19,39,42,39))
正如您所看到的,虽然这个数据集只需要3次迭代,但我所采取的方法中的步骤数量是无法预先定义的(据我所见)。因此,为了实现这种方法,我必须重复步骤2,直到所有的值都被计算出来,可能是通过一个“while”循环。我正在努力想办法解决这个问题

请让我知道,如果你有任何想法,如何解决这一问题,以更有效的方式

提前感谢,

菲尔

编辑:请注意,我在上面没有提到“下一个峰值”不一定是单调递增的。上面的示例意味着可以使用nafill,但是,正如下面的示例/示例输出所示,在下面的实例中,它不会给出正确的输出:

  Test <- data.table(Created = c(5,9,13,15,19,23,27,31,39,42,49),
                 Next_peak = c(27,15,15,19,23,27,42,39,42,49,50),
                 Valid_reversal = c(T,T,F,T,F,F,T,F,F,T,F),
                 Target_output = c(5,9,13,9,9,23,5,31,39,5,5))

Test不确定我是否正确理解您的需求,您可以在步骤1之后使用
nafill

#step 0 & 1
Test[, out := 
    Test[(Valid_reversal)][.SD, on=.(Next_peak=Created), mult="last",
        fifelse(is.na(x.Created), i.Created, NA_integer_)]
]

#your steps 2, 3, ...
Test[Valid_reversal | is.na(out), out := nafill(out, "locf")]

为新示例编辑。您可以使用
igraph
查找链:

#step 0 & 1
Test[, out := 
    Test[(Valid_reversal)][.SD, on=.(Next_peak=Created), mult="last",
        fifelse(is.na(x.Created), i.Created, NA_integer_)]
]

#steps 2, 3, ...
library(igraph)
g <- graph_from_data_frame(Test[Valid_reversal | is.na(out)])
DT <- setDT(stack(clusters(g)$membership), key="ind")[, 
    ind := as.numeric(levels(ind))[ind]][,
        root := min(ind), values]
Test[Valid_reversal | is.na(out), out := DT[.SD, on=.(ind=Created), root]]

谢谢你的帮助。我不太熟悉data.table中mult=“last”功能的使用,因此我一定会进一步研究。我意识到我没有强调上述问题中的一个重要点。我不确定正确的协议是什么,所以我将在这里简单地提出它,并对上面的问题进行进一步的详细编辑。我忽略了补充的一点是,“下一个峰值”并不一定按时间顺序出现。nafill的使用适用于原始示例,因为所有“下一个峰值”值都是有序的。再次感谢!嗨,菲尔,请随意发布一个新问题或编辑这个谢谢-我在上面的问题中添加了另一个例子。它创建了从第一个峰值到所有后续峰值的路径。然后剩下的就是将这些路径的根查找到原始路径中dataset@Phil谢谢我还添加了
while
循环版本
#step 0 & 1
Test[, out := 
    Test[(Valid_reversal)][.SD, on=.(Next_peak=Created), mult="last",
        fifelse(is.na(x.Created), i.Created, NA_integer_)]
]

#steps 2, 3, ...
library(igraph)
g <- graph_from_data_frame(Test[Valid_reversal | is.na(out)])
DT <- setDT(stack(clusters(g)$membership), key="ind")[, 
    ind := as.numeric(levels(ind))[ind]][,
        root := min(ind), values]
Test[Valid_reversal | is.na(out), out := DT[.SD, on=.(ind=Created), root]]
#step 0 & 1
Test[, out :=
    Test[(Valid_reversal)][.SD, on=.(Next_peak=Created), mult="last",
        fifelse(is.na(x.Created), i.Created, NA_integer_)]
]

#step 2, 3, ...
while(Test[, any(is.na(out))]) {
    Test[is.na(out), out := Test[.SD, on=.(Next_peak=Created), mult="first", x.out]]
}
Test