微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

匹配两个数据框并替换其中一个中的相应条目

如何解决匹配两个数据框并替换其中一个中的相应条目

我有以下两个数据框:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

数据框 df = data.frame(From=c("Mike","Elena","Mike","Mark","Alice","Joana"),To=c("Jasmine","Mariah","Erik","Jack","Joana","Mike"),Number=1:6,stringsAsFactors = FALSE) df2 = data.frame(ID=c("1738799","657940","13253","97980","6569874","64839","8494","2773"),Name=c("Mike","Jack"),stringsAsFactors = FALSE) 包含与 df2 中的大多数名称相关联的 ID。我想用相应的 df 替换 df 中的名称。这样:

ID

解决方法

在基础 R 中,您可以:

df3 <- df
nms <- do.call(setNames,unname(df2))
df3[1:2]<- lapply(df[1:2],function(x) ifelse(is.na(a<-nms[x]),x,a))
df3
     From      To Number
1 1738799 Jasmine      1
2  657940   64839      2
3 1738799    8494      3
4   13253    2773      4
5   97980 6569874      5
6 6569874 1738799      6
,

我们可以在 coalesce 中使用 deframetidyverse

library(dplyr)
library(tibble)
df %>%
    mutate(across(From:To,~ coalesce(deframe(df2[2:1])[.],.)))
#     From      To Number
#1 1738799 Jasmine      1
#2  657940   64839      2
#3 1738799    8494      3
#4   13253    2773      4
#5   97980 6569874      5
#6 6569874 1738799      6

或使用 base R (R 4.1.0)

df[1:2] <- setNames(df2$ID,df2$Name)[as.matrix(df[1:2])] |>
       {\(x) ifelse(is.na(x),as.matrix(df[1:2]),x)}() 

-输出

df
#     From      To Number
#1 1738799 Jasmine      1
#2  657940   64839      2
#3 1738799    8494      3
#4   13253    2773      4
#5   97980 6569874      5
#6 6569874 1738799      6
,

您还可以使用以下 tidyverse 解决方案:

library(dplyr)
library(purrr)


df %>%
  map_if(~ is.character(.x),~ ifelse(!is.na(match(.x,df2$Name)),str_replace(.,.x,df2$ID[match(.x,df2$Name)]),.x)) %>%
  bind_cols()


# A tibble: 6 x 3
  From    To      Number
  <chr>   <chr>    <int>
1 1738799 Jasmine      1
2 657940  64839        2
3 1738799 8494         3
4 13253   2773         4
5 97980   6569874      5
6 6569874 1738799      6

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。