R:使用两个变量进行子集

时间:2015-07-24 02:15:04

标签: r subset

这是对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上不兼容。

1 个答案:

答案 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没有行,你会怎么做?你将不得不考虑如何处理它。