Подмножество data.table одной переменной на основе условных значений в других переменных - PullRequest
3 голосов
/ 13 апреля 2019

У меня есть data.table в R, который мне нужно поднастроить на основе определенных условий

dt <- data.table(X_ID=c(1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,3,4,4,4,4,4,4), Y_ID=c(1,2,3,4,5,6, 1,2,3,4,5,6, 1,2,3,4,5,6, 1,2,3,4,5,6), Value1=c(6,4,8,9,10,12,5,7,8,3,4,8,7,3,9,7,4,12,45,3,2,1,2,5),Value2=c(6,6,8,9,10,12,5,4,8,3,4,8,7,5,9,7,4,12,45,1,2,1,2,5))

Я хочу сохранить все X_ID, в которых значение 1 больше значения 2, когда Y_ID равен 2Например, для X_ID = 1 значение 1 больше значения 2, когда Y_ID = 2.В этом случае я хочу сохранить все строки с X_ID = 1.

В настоящее время я использую функцию фильтра (показанную ниже), чтобы найти решение.

dt2 <- filter(dt,is.na(match(dt$X_ID,filter(dt, Y_ID==2&Value1<Value2)$X_ID)))

Но есть ли способ сделать этот код более читабельным?Или использовать нечто родное для data.table для подстановки нужных мне строк?

Ответы [ 2 ]

3 голосов
/ 13 апреля 2019

Использование data.table:

    dt<-dt[X_ID %in% dt[(Y_ID == 2 & (Value1 > Value2))]$X_ID]

#    X_ID Y_ID Value1 Value2
#1:    2    1      5      5
#2:    2    2      7      4
#3:    2    3      8      8
#4:    2    4      3      3
#5:    2    5      4      4
#6:    2    6      8      8
#7:    4    1     45     45
#8:    4    2      3      1
#9:    4    3      2      2
#10:    4    4      1      1
#11:    4    5      2      2
#12:    4    6      5      5
2 голосов
/ 13 апреля 2019

Используя dplyr, мы можем group_by X_ID и filter для групп, где есть хотя бы одно значение для Y_ID == 2 и Value1 > Value2.

library(dplyr)

dt %>%
  group_by(X_ID) %>%
  filter(any(Y_ID == 2 & Value1 > Value2))

#    X_ID  Y_ID Value1 Value2
#   <dbl> <dbl>  <dbl>  <dbl>
# 1     2     1      5      5
# 2     2     2      7      4
# 3     2     3      8      8
# 4     2     4      3      3
# 5     2     5      4      4
# 6     2     6      8      8
# 7     4     1     45     45
# 8     4     2      3      1
# 9     4     3      2      2
#10     4     4      1      1
#11     4     5      2      2
#12     4     6      5      5
...