在其他数据框中查找匹配值和 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)]))
我在 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)]))