在其他数据框中查找匹配值和 Return ID

Lookup Matching Value in Other Dataframe and Return ID

我在 R 中有一个包含动物之间关系的数据框(关系):

animal1 | animal2 | relationship  
dog       cat       friendly
cat       dog       amicable
pig       goose     mean

我有另一个包含每只动物信息的数据框(动物):

id | animal | count   
1   dog       2      
2   cat       5       
3   pig       1     
4   goose     2

我想用第二个数据框中的 ID 值替换第一个数据框中的动物,即

animal1 | animal2 | relationship  
1       | 2       | friendly
2       | 1       | amicable
3       | 4       | mean

我该怎么做?到目前为止,我可以使用 grepl 为单个项目执行此操作,即

which(grepl(relationship$animal1[3],animal$id)) >>>> 2

我如何将其普遍应用于整个关系数据框并用结果替换 animal1/animal2 列?

这是一个使用 tidyverse 的选项。我们 gather 数据为 'long' 格式,left_join 使用第二个数据集,将 'animal' 列的值更改为 'id' 和 spread 它到 'wide' 格式

library(tidyverse)
gather(df1, key, animal, animal1:animal2) %>%
        left_join(df2[-3]) %>% 
        mutate(animal = id) %>% 
        select(-id)  %>% 
        spread(key, animal) %>%
        select(names(df1))

或者不在 base R 中进行重塑的另一种选择是循环遍历前两列,对 'df2' 的 'animal 列执行 match 并获得相应的'id's,将其分配回感兴趣的列

df1[1:2] <- lapply(df1[1:2], function(x) df2$id[match(x, df2$animal)])
df1
#   animal1 animal2 relationship
#1       1       2     friendly
#2       2       1     amicable
#3       3       4         mean

或者与 dplyr 类似的方法是

df1 %>% 
    mutate_at(vars(matches("animal")), funs(df2$id[match(., df2$animal)]))