我有以下简单的data.table“test”。我想选择第 3 行到第 8 行的所有行,其中 X 等于“A”:

library(data.table)
set.seed(1)
test <- data.table(X=c(rep("A",5),rep("B",5)),Y=rnorm(10),Z=rnorm(10))

test[3:8 & X == "A"] # gives the not desired output:

1: A -0.6264538  1.5117812
2: A  0.1836433  0.3898432
3: A -0.8356286 -0.6212406
4: A  1.5952808 -2.2146999
5: A  0.3295078  1.1249309
Warning message:
  In 3:8 & X == "A" :
  longer object length is not a multiple of shorter object length

# desired outcome:

3: A -0.8356286 -0.62124058
4: A  1.5952808 -2.21469989
5: A  0.3295078  1.12493092

在第 3:8 行之间,我只想选择 X == "A"的那些。这怎么可能?请注意,使用 test[3:8][X == "A"] 似乎不是一种选择,因为我想对保存在原始数据表中的这些行进行一些计算。

最佳答案

这里 3:8 绝对与第二个表达式 ( X == "A" ) 的长度不同,而且我们将逻辑索引与数字索引进行比较。相反,通过在行序列上使用 %in% 将第一个表达式转换为逻辑表达式,然后会发生两件事 - 1)长度变得相同,2)相同类型

test[(seq_len(.N) %in% 3:8) & X == "A"]
#    X          Y          Z
#1: A -0.8356286 -0.6212406
#2: A  1.5952808 -2.2146999
#3: A  0.3295078  1.1249309

关于r - 使用行号和值过滤器进行选择,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56709295/

10-12 17:08
查看更多