我在R中有一个data.table,需要根据某些条件对其进行子集
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))
我想保留所有Y_ID等于2时值1大于值2的X_ID。例如,对于X_ID = 1,当Y_ID = 2时值1大于值2。在这种情况下,我要保留X_ID = 1的所有行。
我目前正在使用过滤器功能(如下所示)来解决问题。
dt2 <- filter(dt,is.na(match(dt$X_ID,filter(dt, Y_ID==2&Value1<Value2)$X_ID)))
但是有没有办法使此代码更具可读性?还是使用data.table固有的东西来对我需要的行进行子集化?
答案 0 :(得分:3)
使用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
答案 1 :(得分:2)
使用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