【发布时间】:2019-12-17 05:11:44
【问题描述】:
我想对我的数据行进行子集化
library(data.table); set.seed(333); n <- 100
dat <- data.table(id=1:n, x=runif(n,100,120), y=runif(n,200,220), z=runif(n,300,320))
> head(dat)
id x y z
1: 1 109.3400 208.6732 308.7595
2: 2 101.6920 201.0989 310.1080
3: 3 119.4697 217.8550 313.9384
4: 4 111.4261 205.2945 317.3651
5: 5 100.4024 212.2826 305.1375
6: 6 114.4711 203.6988 319.4913
分几个阶段。我知道我可以按顺序申请subset(.) 来实现这一点。
> s <- subset(dat, x>119)
> s <- subset(s, y>219)
> subset(s, z>315)
id x y z
1: 55 119.2634 219.0044 315.6556
我的问题是我需要自动执行此操作,并且子集可能为空。在这种情况下,我想跳过导致空集的步骤。例如,如果我的数据是
dat2 <- dat[1:50]
> s <-subset(dat2,x>119)
> s
id x y z
1: 3 119.4697 217.8550 313.9384
2: 50 119.2519 214.2517 318.8567
第二步subset(s, y>219) 会空出来,但我仍然想应用第三步subset(s,z>315)。有没有办法仅在导致非空集时才应用子集命令?我想像subset(s, y>219, nonzero=TRUE) 这样的东西。我想避免像
s <- dat
if(nrow(subset(s, x>119))>0){s <- subset(s, x>119)}
if(nrow(subset(s, y>219))>0){s <- subset(s, y>219)}
if(nrow(subset(s, z>318))>0){s <- subset(s, z>319)}
因为我担心 if-then 丛林会相当缓慢,特别是因为我需要使用 lapply(.) 将所有这些应用到列表中的不同 data.tables。这就是为什么我希望找到一个针对速度优化的解决方案。
PS。为了清楚起见,我只选择了subset(.),解决方案例如如果不是更多的话,data.table 也会受到欢迎。
【问题讨论】:
-
如果初始数据集是
data.table,为什么不使用data.table方法`dat[x > 119 & y > 219]` -
这会忽略会导致空集的条件元素吗?
标签: r data.table subset