r - 使用 2 个数据框 (R) 匹配和替换值
问题描述
2 dfs,需要将“Name”与 info$Name 匹配并替换 details$Salary 中的相应值,df - details 应该保留所有值并且应该没有 NA(如果找到匹配,则替换该值,如果未找到则保持原样)
details<- data.frame(Name = c("Aks","Bob","Caty","David","Enya","Fredrick","Gaby","Hema","Isac","Jaby","Katy"),
Age = c(12,22,33,43,24,67,41,19,25,24,32),
Gender = c("f","m","m","f","m","f","m","f","m","m","m"),
Salary = c(1500,2000,3.6,8500,1.2,1400,2300,2.5,5.2,2000,1265))
info <- data.frame(Name = c("caty","Enya","Dadi","Enta","Billu","Viku","situ","Hema","Ignu","Isac"),
income = c(2500,5600,3200,1522,2421,3121,4122,5211,1000,3500))
预期结果 :
Name Age Gender Salary
Aks 12 f 1500
Bob 22 m 2000
Caty 33 m 2500
David 43 f 8500
Enya 24 m 5600
Fredrick 67 f 1400
Gaby 41 m 2300
Hema 19 f 5211
Isac 25 m 3500
Jaby 24 m 2000
Katy 32 m 1265
以下都没有给出预期的结果
dplyr::left_join(details,info,by = "Name")
dplyr::right_join(details,info,by = "Name")
dplyr::inner_join(details,info, by ="Name") # for other matching and replace this works fine but not here
dplyr:: full_join(details,info,by ="Name")
所有结果都给出了 NA,也尝试使用 match 函数,但它没有给出想要的结果,任何帮助将不胜感激
解决方案
您Name
在不同情况下的两个数据框中都有,我们需要先将它们放在相同的情况下,然后对left_join
它们进行 a 并用于选择和coalesce
之间的第一个非 NA 值。income
salary
library(dplyr)
details %>% mutate(Name = stringr::str_to_title(Name)) %>%
left_join(info %>% mutate(Name = stringr::str_to_title(Name)), by = "Name") %>%
mutate(Salary = coalesce(income, Salary)) %>%
select(names(details))
# Name Age Gender Salary
#1 Aks 12 f 1500
#2 Bob 22 m 2000
#3 Caty 33 m 2500
#4 David 43 f 8500
#5 Enya 24 m 5600
#6 Fredrick 67 f 1400
#7 Gaby 41 m 2300
#8 Hema 19 f 5211
#9 Isac 25 m 3500
#10 Jaby 24 m 2000
#11 Katy 32 m 1265
推荐阅读
- python - Python无法导入任何模块
- html - 有没有办法拥有一个网格空间垂直和水平对齐,同时占据整个区域?
- oracle - IN 子句的性能问题
- r - 在 R 中存储可变长度时间序列数据的最佳方法
- excel - 在 Powershell 中比较两个 Excel 文件
- html - 如何根据不同的手机屏幕尺寸制作CSS?
- ios - iOS 3D touch on app 如何实现自动化?
- amazon-web-services - 如何合并 AWS S3 存储桶策略?
- javascript - js异步函数不等待内部forEach循环
- android - Google Cloud 项目的 OAuth 同意屏幕仪表板中缺少 OAuth 授权率图表