【发布时间】:2019-12-19 06:27:42
【问题描述】:
我想对我的数据行进行子集化
library(data.table); set.seed(333); n <- 100
dat <- data.table(id=1:n, group=rep(1:2,each=n/2), x=runif(n,100,120), y=runif(n,200,220), z=runif(n,300,320))
> head(dat)
id group x y z
1: 1 1 109.3400 208.6732 308.7595
2: 2 1 101.6920 201.0989 310.1080
3: 3 1 119.4697 217.8550 313.9384
4: 4 1 111.4261 205.2945 317.3651
5: 5 1 100.4024 212.2826 305.1375
6: 6 1 114.4711 203.6988 319.4913
分几个阶段,除非它导致一个空子集。在这种情况下,我想跳过那个特定的子集。在earlier question 中,Frank 找到了一个很好的解决方案:
f = function(x, ..., verbose=FALSE){
L = substitute(list(...))[-1]
mon = data.table(cond = as.character(L))[, skip := FALSE]
for (i in seq_along(L)){
d = eval( substitute(x[cond, verbose=v], list(cond = L[[i]], v = verbose)) )
if (nrow(d)){
x = d
} else {
mon[i, skip := TRUE]
}
}
print(mon)
return(x)
}
我可以在其中手动输入数据和每个变量的截止值。
> f(dat, x > 119, y > 219, y > 1e6)
cond skip
1: x > 119 FALSE
2: y > 219 FALSE
3: y > 1e+06 TRUE
id group x y z
1: 55 2 119.2634 219.0044 315.6556
我现在想知道如何将这个(或更好的东西!)应用于截止点位于第二个 data.table 中的情况
c <- data.table(group=1:2, x=c(110,119), y=c(210,219), z=c(310,319))
> c
group x y z
1: 1 110 210 310
2: 2 119 219 319
并分别为每个组指定。
如果我要使用f(.),我想将c 加入dat,但无法弄清楚。但也许完全有一种更聪明的方法。
【问题讨论】:
标签: r data.table subset