r - 如何创建与全名单词的前 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”,但我认为这更复杂。
解决方案
您可以使用tidyr
和separate()
从第一个 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)
推荐阅读
- javascript - 在 node.js --prof 输出中,这个名字奇怪的 C++ 函数在做什么?
- javascript - 音频文件的混合内容
- c++ - MobileNet SSD V2 转换的 tflite 模型的错误输出
- php - php脚本找不到包含文件
- python - 在python中添加365天至今
- winapi - 如何在 win32 中使用 SetTextColor 更改文本 SetDlgItemText 的颜色?
- math - 我将使用“光线投射器”选择“对象”之一进行放大
- python - MNIST图像数据上的EM算法python
- java - 如何在不发送实体的完整 json 的情况下更新对象
- azure - Azure 事件网格出口限制