R:用两个变量子集

R: Subsetting with two variables

这是以下内容的后续:

发布的解决方案有效,现在我想根据第二个变量添加一个低截止值。到目前为止,我不确定如何使用 data.table 来解决这个问题。例如,我想将输出限制为 B 的最大值以及 TrialNum 在 D == 1 的第一个实例之后的所有值。我认为这意味着提取和使用与 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 低于阈值的数据。就像昨天发布的解决方案一样,我尝试了在表达式中使用 which 的变体来捕获 max(B) 和与 D.

相关的低截止值

data.table 解决方案更可取,因为目前 data.table 和 dplyr 在 Windows R3.2.0.

上似乎不兼容

解决你的问题,想一想如何找到你所在的行号 之后。

假设我们的数据框目前只有一个 TrialNum。在您之前的问题中,您了解到要查找最大值为 B 的行,您可以使用 which.max(B).

现在你想找到D为1的行,所以你可以使用which(D==1)。现在,如果多行等于 1,which 将 return 多个索引(参见 ?which),因此您可以使用 [1] 仅获取第一次出现的索引。由于您不想包含 D==1 行本身,因此向索引添加 1:which(D==1)[1] + 1.

当你有这两个数字时,你只需要中间的所有行,即 (which(D==1)[1] + 1):which.max(B).

然后结合by=TrialNum确保你的dataframe里面只有一个TrialNum:

x[, .SD[(which(D==1)[1] + 1):which.max(B)], by=TrialNum]

(注意 - 如果 D==1 没有行,你会怎么做?你将不得不考虑如何处理它)。