首页 > 解决方案 > 如何创建与全名单词的前 9 个字符匹配的条件?

问题描述

如何创建将用户名的前 9 个字符与其全名匹配的条件?

我有两个数据框:

df1 <- data.frame(full_name = c("alex sainz Lopez", "antonio garcia jimenez", "jorge rivas", "beatriz samanes", "pedro lopez"))

df2 <- data.frame(user = c("sainza", "garciaa", "rivasj", "samanesb", "lopezp"))

我想创建一个条件列,将第二个数据框中包含的用户与第一个数据框中包含的全名相匹配。

我知道我可以 cbind 两列,但我需要这样做。我想在一个正则表达式中匹配除用户名的最后一个字符之外的所有字符与 full_name 但我不知道如何编写它(我已经尝试过多次但我没有得到我想要的结果)

我想要的结果是:

result <- data.frame(full_name = c("alex sainz Lopez", "antonio garcia jimenez", "jorge rivas", "beatriz samanes", "pedro lopez"),
                     user = c("sainza", "garciaa", "rivasj", "samanesb", "lopezp"))

最好的解决方案是创建一个条件:“如果 user_name 与 full_name 相似,则 result = full_name”,但我认为这更复杂。

标签: r

解决方案


您可以使用tidyrseparate()从第一个 df 创建用户名。

library(dplyr)
library(tidyr)
df1 <- data.frame(full_name = c("alex sainz Lopez", "antonio garcia jimenez", "jorge rivas", "beatriz samanes", "pedro lopez"))

df2 <- data.frame(user = c("sainza", "garciaa", "rivasj", "samanesb", "lopezp"))

result <- data.frame(full_name = c("alex sainz Lopez", "antonio garcia jimenez", "jorge rivas", "beatriz samanes", "pedro lopez"),
                     user = c("sainza", "garciaa", "rivasj", "samanesb", "lopezp"))


df3 <- df1 |>  
  tidyr::separate(full_name, into = c("name1","name2","name3"), remove = FALSE) |> 
  mutate(user = paste0(name2, substr(name1,1,1))) |> 
  select(-name1, - name2, -name3)

all.equal(df3, result)

如果您的第二个名字很长并且用户名的最大长度为 9,您可以修改代码以提取第二个名字的前 8 个字符和名字的第一个字母。

df3 <- df1 |>  
  tidyr::separate(full_name, into = c("name1","name2","name3"), remove = FALSE) |> 
  mutate(user = paste0(substr(name2,1,8), substr(name1,1,1))) |> 
  select(-name1, - name2, -name3)

推荐阅读