2015-05-13 86 views
2

我有個問題讓我意想不到的麻煩。這個問題看起來很簡單,我想根據幾個條件對data.table進行子集劃分。我們來考慮一下這個例子。想像我有一個data.table像下面的那個。現在,我想從中推斷出一個子集,使得a> = 1045和< = 1180和(b ==「c」或b ==「d」)。如何根據幾個條件對數據表進行子集

dt<-data.table(a=(1000:1200), b=sample(letters[1:3], size=201, replace=T)) 

我讀了data.table指南和常見問題解答,並搜查了論壇,但我似乎還沒有找到任何東西是相關的。如果你認爲這個問題毫無意義,我很抱歉。

回答

3

您可以嘗試

dt[a>=1045 & a <=1180 & b %chin% c('c', 'd')] 

或者作爲@大衛Arenburg評論,between可用於

dt[between(a, 1045, 1180) & b %chin% c('c', 'd')] 
+0

@DavidArenburg你的意思是基地R操作會起作用嗎? – akrun

+0

@DavidArenburg我相信你的話。如果有人抱怨,我會直接面向你:-) – akrun

+0

非常感謝這兩個! :)我甚至在你建議的代碼之前嘗試過,但是它沒有起作用的原因是因爲我的一列是一個因素,邏輯上'小於或等於'是不允許的。 – Riccardo

1

更多data.table -y溶液(後首先定義idas.factor(1000:1200)),即趁着二進制搜索:

setkey(dt,a,b) 
dt[.(rep(paste0(1045:1180),2),rep(c("b","c"),each=136)),nomatch=0L] 

(我們必須指定nomatch,否則我們就回到一切 - 它會更容易分辨出來,如果你有第三個變量,它會回來的NA,提供無與倫比的組合鍵)

(當然如果你投a的數字,我們不需要paste0位)


一個這樣(無需指定循環自己,基本上是更清潔的方式)與CJ功能:

setkey(dt,a,b) 
dt[CJ(paste0(1045:1180),c("c","d")),nomatch=0L] 
相關問題