我在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列?
答案 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)]))