Выбор с фильтром по номеру строки и значению - PullRequest
3 голосов
/ 21 июня 2019

У меня есть следующий простой 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 ]

5 голосов
/ 21 июня 2019

Здесь 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
4 голосов
/ 21 июня 2019
library(data.table)
set.seed(1)
test <- data.table(X=c(rep("A",5),rep("B",5)),Y=rnorm(10),Z=rnorm(10))

test[test[, .I %in% 3:8 & X == "A"], Z := Z+3][]
#>     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

Создано в 2019-06-21 пакетом Представления (v0.3.0)

0 голосов
/ 21 июня 2019

Если вам нужно выбрать строки из определенного индекса (3: 8), а затем отфильтровать переменную с определенным значением (здесь X == 'A'), вы можете попробовать с `dplyr package ':

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')
...