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
没有行,你会怎么做?你将不得不考虑如何处理它)。
这是以下内容的后续:
发布的解决方案有效,现在我想根据第二个变量添加一个低截止值。到目前为止,我不确定如何使用 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
没有行,你会怎么做?你将不得不考虑如何处理它)。