其他数据框和返回ID中的查找匹配值

时间:2018-03-03 01:30:04

标签: r lookup-tables grepl

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

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

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

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

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

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

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

void arithmetic (int *a, int *b, size_t n)
{
    if (!a || !b)
        return;

    for(size_t i = 0; i < n; i++, a++, b++)
        *b = (*a + 6) % 10;
}

如何在整个关系数据框中一般地应用它,并用结果替换animal1 / animal2列?

1 个答案:

答案 0 :(得分:1)

以下是使用tidyverse的选项。我们gather将数据{长}&#39;使用第二个数据集格式化left_join,更改动物&#39;值为&#39; id&#39;的列并且spread它到广泛的&#39;格式

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进行重新整形,则另一个选项是循环显示前两列,使用&#39; df2&#39;的动物列进行match。并获取相应的ID,将其分配回感兴趣的列

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)]))