R 对行号和值进行筛选的选择

R 对行号和值进行筛选的选择,r,data.table,subset,R,Data.table,Subset,我有以下简单的data.table测试。我想选择第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

我有以下简单的data.table测试。我想选择第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
图书馆数据表 设定种子1 测试X Y Z >1:A-0.6264538 1.51178117 >2:A 0.1836433 0.38984324 >3:A-0.8356286 2.37875942 >4:A 1.5952808 0.78530011 >5:A 0.3295078 4.12493092 >6:B-0.8204684-0.04493361 >7:B 0.4874291-0.01619026 >8:B 0.7383247 0.94383621 >9:B 0.5757814 0.82122120 >10:B-0.3053884 0.59390132
如果需要从某些索引3:8中选择行,然后过滤出具有特定值的变量,则由v0.3.0于2019-06-21创建,此处X='a', 您可以试用“dplyr软件包”:

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

test %>% slice(3:8) %>% filter(X == 'A')

test[3:8,][X==A,]@M-M我也在考虑同样的问题,但我想对保存在test中的其他列(如Y和Z)执行计算。这种方法会创建一个新的DT,因此不会保存计算。例如,试试test[3:8,][X==A,Z:=Z+3]谢谢,我原以为它是一行。有趣的工作方式。N@冰淇淋没问题。我是关于编辑的,但是有另一个解决方案是在hanks@M-M之后。我接受了akrun的回答,他有点犹豫faster@Talik3233别担心,就在昨天,阿克伦和我谈论他们是我的对手;仅供参考,OP在评论中指出,他们希望更新/变异这些行。不过,您的帖子仍然是对所发布问题的有效答案。