如何解决匹配两个数据框并替换其中一个中的相应条目
我有以下两个数据框:
<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
中使用 deframe
和 tidyverse
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 举报,一经查实,本站将立刻删除。