2017-02-03 7 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) в результате? Большинство вещей, которые я пробовал, в конечном итоге вытягивают все строки с любой из трех переменных, соответствующих вместо всех трех.

EDIT: Исправлена ​​ошибка, что результат должен быть

+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

Пауло, ты прав. Я не был очень осторожен с моим примером. Сожалею! – 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

добавив несколько точек на у логики:

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

Почему я получил нижний план? ум, объясняющий, что кто бы это ни сделал? –

+2

Не мое нисходящее, но это похоже на хакерский способ сделать внутреннее соединение. Я думаю, что ответ «просто использовать слияние» Пауло находится на месте. – Gregor

+0

@ joel.wilson "_why я получил downvote ?? _" Я не тот, кто его понизил, но это, вероятно, потому, что только для кода ответы низкого качества. Чтобы изменить контекст, отредактируйте его. –

0

Мы можем использовать tidyverse

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