繁体   English   中英

R:具有两个变量的子集

[英]R: Subsetting with two variables

这是对以下内容的后续操作: R:将增加值的子集设置为max(不包括减少值)

发布的解决方案有效,现在我想基于第二个变量添加一个低截止值。 到目前为止,我还不确定如何使用data.table进行处理。 例如,我想通过TrialNum将输出限制为B的最大值以及D == 1的第一个实例之后的所有值。 我认为这意味着提取并使用与D的低截止值相关的索引(使用which?)。

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解决方案,因为它似乎当前在Windows R3.2.0上与data.table和dplyr不兼容。

要解决您的问题,请考虑如何查找要查找的行号。

假设目前我们的数据框中只有一个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结合使用by=TrialNum以确保您的数据帧中只有一个TrialNum

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

(注意-如果D==1行不存在,该怎么办?您将不得不考虑如何处理该行)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM