2017-02-03 110 views
1

我有一個數據集如下(以data.frame格式):子集R中與多個標準

>dataset 
X Y Z Value 
a c f 12 
a d f 45 
a c f 654 
a d g 684 
a c g 54 
b d f 78 
b c f 31 
b d f 777 
b c g 54 
b d g 45 

我有標準的一個第二data.frame:

>criteria 
X Y Z 
a c f 
b d f 

如何在這個例子中,我將第二個矩陣應用於第一個矩陣,從而得到c(654,12,777,68)?我試過的大部分事情最終都是用三個變量中的任何一個匹配,而不是全部三個匹配。

編輯:修正了什麼結果應該是

+0

你可以用'merge'。有關更多詳細信息,請參閱[本文](http://stackoverflow.com/questions/1299871/how-to-join-merge-data-frames-inner-outer-left-right)。 – lmo

+1

爲什麼'c(654,12,777,68)'結果呢? –

+0

Paulo,你是對的。我顯然不太在乎我的例子。抱歉! – user79928

回答

3

只需使用merge

merge(df1, df2) 

如果你只想載體:

merge(df1, df2)[,'Value'] 

數據:

df1 <- read.table(text = 
'X Y Z Value 
a c f 12 
a d f 45 
a c f 654 
a d g 684 
a c g 54 
b d f 78 
b c f 31 
b d f 777 
b c g 54 
b d g 45', h = T) 

df2 <- read.table(text = ' 
X Y Z 
a c f 
b d f', h = T) 
0

加入Y上的邏輯幾點:

do.call(paste0, criteria) 
# [1] "acf" "bdf" 
do.call(paste0, dataset[1:3]) 
# [1] "acf" "adf" "acf" "adg" "acg" "bdf" "bcf" "bdf" "bcg" "bdg" 
v = do.call(paste0, dataset[1:3]) %in% do.call(paste0, criteria) 
# [1] TRUE FALSE TRUE FALSE FALSE TRUE FALSE TRUE FALSE FALSE 

現在這個邏輯向量用於子集值列

dataset$Value[v] 
# [1] 12 654 78 777 
+0

爲什麼我得到一個downvote?介意解釋誰做的? –

+2

不是我的失望,但這似乎是一個哈克的方式來做一個內部連接。我認爲Paulo的「只是使用合併」的答案是現貨。 – Gregor

+0

@ joel.wilson「_Why我得到了一個downvote ?? _」我不是那個低估了它的人,但這可能是因爲代碼唯一的答案是低質量。請編輯添加一些上下文。 –

0

我們可以使用tidyverse

library(tidyverse) 
inner_join(df1, df2) %>% 
      select(Value)