2013-08-30 24 views
1

我正在使用R從數據框中提取一組行。許多行被重複拉動。這些行使用兩個標準進行選擇。不幸的是,結果產生了一組符合標準的獨特行。我將證明......R中的data.frame的非唯一結果匹配條件

鑑於data.frame:

a = data.frame(array(c(1,2,3,1,4,5,6,2,7,8,9,4), c(4,3))) 

這將是這樣的:

X1 X2 X3 
1 1 4 7 
2 2 5 8 
3 3 6 9 
4 1 2 4 

讓想我希望有兩套由規定的標準時a調用陣列:

criteriaX1 = c(1,2,1,1,2) 
criteriaX2 = c(4,5,4,2,5) 

然後我會使用這個命令:

a[ a$X1 %in% criteriaX1 & a$X2 %in% criteriaX2, ] 

希望能得到5行像這樣(看@ criteriaX1的關鍵,並讀下來X1。應明智的,如果它沒有的話):

X1 X2 X3 
1 1 4 7 
2 2 5 8 
3 1 4 7 
4 1 2 4 
5 2 5 8 

而是我剛剛得到這個:

X1 X2 X3 
1 1 5 9 

我猜它是與%in%定義組的成員,但我我不知道如何在沒有令人討厭的循環的情況下解決這個問題。所有的幫助表示讚賞。

謝謝。

+2

'criteriaX2'是不是真的做任何事情,所以天真的解決方案是使用'match':'A [匹配(criteriaX1,一$ X1),]' – Justin

+0

這是什麼意思(以自然語言,請)將3添加到'criteriaX1'? –

+0

我修改了「+ 3」以使其更清楚,但它只是爲了使它代表「criteriaX2」列中的值。此外,謝謝賈斯汀,「匹配」在你描述的條件下工作,但我的意思是在兩欄中條件是唯一的。 – cranberry

回答

4

你可以使用一個data.table相等連接:

library(data.table) 
a <- data.table(a) 
b <- data.table(X1 = criteriaX1, X2 = criteriaX2) 

setkey(a, X1, X2) 
a[b] 
# X1 X2 X3 
# 1: 1 4 7 
# 2: 2 5 8 
# 3: 1 4 7 
# 4: 1 4 7 
# 5: 2 5 8 
+0

我不知道它是或多或少混淆,但'b'可以有不同名稱的列:'b < - data.table(criteriaX1,criteriaX2)'。 – Frank

+0

然後:'a [b [,list(X1 = criteriaX1,X2 = criteriaX2)]]'' – flodel

+0

哦,我的意思是連接並不關心b中變量的名字。它只是爲了他們。 (如果b有一個鍵,則會發生不同的事情)。一個較短但可能更不透明的方法是'adt [J(criteriaX1,criteriaX2)]'(其中'adt'是'data.table(a)' )。 – Frank

相關問題