这是对R: Subsetting on increasing value to max excluding the decreasing
的跟进已发布的解决方案有效,现在我想根据第二个变量添加一个低截止值。到目前为止,我不确定如何使用data.table来解决这个问题。作为一个例子,我想在TrialNum的第一个D == 1实例之后将输出限制为B的最大值和所有值。我认为这意味着提取和使用与D的低截止相关联的索引(使用哪个?)。
TrialNum,Obs ,A,B,C,D
1,1,23,1,23,1
1,2,21,2,21,2
1,3,14,3,14,1
1,4,34,4,34,3
1,5,32,5,32,2
1,6,21,3,21,1
1,7,16,5,16,3
1,8,18,2,18,1
2,1,26,1,26,1
2,2,11,2,11,2
2,3,23,3,23,1
2,4,12,4,12,1
2,5,3,2,3,1
2,6,4,3,4,3
2,7,22,1,22,1
2,8,15,2,15,1
预期产出,
TrialNum,Obs,A,B,C,D
1,2,21,2,21,2
1,3,14,3,14,1
1,4,34,4,34,3
1,5,32,5,32,2
2,2,11,2,11,2
2,3,23,3,23,1
2,4,12,4,12,1
所以,这只是低截止点的第一个例子。在确定起点后D不低于阈值时,我不会丢失数据。就像昨天发布的解决方案一样,我尝试了在表达式中使用 的变体来捕获与D相关的最大值(B)和低截止值。
data.table解决方案更可取,因为目前看来data.table和dplyr在Windows R3.2.0上不兼容。
答案 0 :(得分:0)
要解决您的问题,请考虑如何查找您的行号 后。
假设我们的数据帧目前只有一个TrialNum。在上一个问题中,您了解到要查找最大值为B
的行,您可以使用which.max(B)
。
现在您要查找D
为1的行,以便您可以使用which(D==1)
。现在,如果多行等于1,which
将返回多个索引(请参阅?which
),因此您可以使用[1]
来获取第一个出现的索引。由于您不希望自己包含D==1
行,因此请在索引中添加1:which(D==1)[1] + 1
。
如果您有这两个数字,则只需要中间的所有行,即(which(D==1)[1] + 1):which.max(B)
。
然后与by=TrialNum
结合使用,以确保您的数据框中只有一个TrialNum
:
x[, .SD[(which(D==1)[1] + 1):which.max(B)], by=TrialNum]
(注意 - 如果D==1
没有行,你会怎么做?你将不得不考虑如何处理它。