如何根据几个条件对数据 table 进行子集化
How to subset a data table according to several conditions
我有一个问题给我带来了意想不到的麻烦。这个问题看起来非常简单,是我想根据一些条件对 data.table
进行子集化。让我们考虑这个例子;想象一下我有一个 data.table
如下所示。现在,我想从中推断出一个子集,使得 a>=1045 和 a<=1180 和 (b=="c" or b=="d").
dt<-data.table(a=(1000:1200), b=sample(letters[1:3], size=201, replace=T))
我阅读了 data.table
指南和常见问题解答并搜索了论坛,但似乎没有找到任何相关内容。如果您认为这个问题毫无意义,我提前道歉。
你可以试试
dt[a>=1045 & a <=1180 & b %chin% c('c', 'd')]
或者正如@David Arenburg 评论的那样,between
可以使用
dt[between(a, 1045, 1180) & b %chin% c('c', 'd')]
更多data.table
-y解决方案(首先将id
定义为as.factor(1000:1200)
),即利用二分查找:
setkey(dt,a,b)
dt[.(rep(paste0(1045:1180),2),rep(c("b","c"),each=136)),nomatch=0L]
(我们必须指定 nomatch
,否则我们将只是 return 一切——如果你有第三个变量,它会更容易区分,它会返回为 NA
用于不匹配的组合键)
(当然,如果您将 a
转换为数字,我们不需要 paste0
位)
一个更简洁的方法(基本上不需要我们自己指定回收)是使用 CJ
函数:
setkey(dt,a,b)
dt[CJ(paste0(1045:1180),c("c","d")),nomatch=0L]
我有一个问题给我带来了意想不到的麻烦。这个问题看起来非常简单,是我想根据一些条件对 data.table
进行子集化。让我们考虑这个例子;想象一下我有一个 data.table
如下所示。现在,我想从中推断出一个子集,使得 a>=1045 和 a<=1180 和 (b=="c" or b=="d").
dt<-data.table(a=(1000:1200), b=sample(letters[1:3], size=201, replace=T))
我阅读了 data.table
指南和常见问题解答并搜索了论坛,但似乎没有找到任何相关内容。如果您认为这个问题毫无意义,我提前道歉。
你可以试试
dt[a>=1045 & a <=1180 & b %chin% c('c', 'd')]
或者正如@David Arenburg 评论的那样,between
可以使用
dt[between(a, 1045, 1180) & b %chin% c('c', 'd')]
更多data.table
-y解决方案(首先将id
定义为as.factor(1000:1200)
),即利用二分查找:
setkey(dt,a,b)
dt[.(rep(paste0(1045:1180),2),rep(c("b","c"),each=136)),nomatch=0L]
(我们必须指定 nomatch
,否则我们将只是 return 一切——如果你有第三个变量,它会更容易区分,它会返回为 NA
用于不匹配的组合键)
(当然,如果您将 a
转换为数字,我们不需要 paste0
位)
一个更简洁的方法(基本上不需要我们自己指定回收)是使用 CJ
函数:
setkey(dt,a,b)
dt[CJ(paste0(1045:1180),c("c","d")),nomatch=0L]