如何解决将全名与R中的反向匹配
我在数据集中有2列,分别是名称1和名称2。
Column 1 | Column 2
John,Smith | Smith,John
如果它们在R中也是相反的顺序,我如何比较它们并使第三列返回TRUE
(最好是tidyverse)
解决方法
这是一种明确的实现方式,(在我看来)对于问题中的确切用例来说是最清晰的:
library(tidyverse)
# data
dat <- tibble(col1 = "John,Smith",col2 = "Smith,John")
# extractor funcs
post_comma <- function(x) gsub('^.*,','',x)
pre_comma <- function(x) gsub(',.*$',x)
dat %>%
mutate(is_same =
pre_comma(col1) == post_comma(col2) &&
post_comma(col1) == pre_comma(col2)
)
,
您可以使用逗号分割字符串,对它们进行排序,然后按元素进行比较:
library(tidyverse)
df %>%
mutate(compare = map2_lgl(str_split(Column1,\\s*'),str_split(Column2,~all(sort(.x) == sort(.y))))
# Column1 Column2 compare
#1 John,Smith Smith,John TRUE
可以使用Map
完成基数R中的操作:
df$compare <- mapply(function(x,y) all(sort(x) == sort(y)),strsplit(df$Column1,strsplit(df$Column2,\\s*'))
,
您可以尝试的另一种方法。这里我用假数据来说明
df <- data.frame(col1 = c("John,"Peter,Crouch"),col2 = c("Smith,John",Pan"))
df$col1_new <- sapply(lapply(strsplit(df$col1,","),sort),paste,collapse = " ")
df$col2_new <- sapply(lapply(strsplit(df$col2,collapse = " ")
df <- df %>%
mutate(col3 = ifelse(col1_new == col2_new,TRUE,FALSE))
# col1 col2 col1_new col2_new col3
# 1 John,Smith Smith,John John Smith John Smith TRUE
# 2 Peter,Crouch Peter,Pan Crouch Peter Pan Peter FALSE
,
还可以使用子功能:
"Column 1 | Column 2
John,Smith | Smith,John" -> a
df <- read.table(text = a,header = TRUE,sep = '|',strip.white = TRUE)
sub("^(\\w+)(,\\s+)(\\w+)$","\\3\\2\\1",df[,2]) == df[,1]
[1] TRUE
如果您的数据尚未修剪,请先执行。
df[] <- trimws(as.matrix(df))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。