Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 我想找到重复的数据帧的基础上的名字和姓氏。使用部分字符串匹配_R_Duplicates_Match_Stringr - Fatal编程技术网

R 我想找到重复的数据帧的基础上的名字和姓氏。使用部分字符串匹配

R 我想找到重复的数据帧的基础上的名字和姓氏。使用部分字符串匹配,r,duplicates,match,stringr,R,Duplicates,Match,Stringr,这是一个示例数据帧,我只想使用部分字符串匹配来确定它们是否有任何可以找到重复项的函数 df 数据准备 使用dplyr,首先将first和last名称连接成一个整体名称 library(dplyr) df1 <- df %>% rowwise() %>% # rowwise operation mutate(whole=paste0(name,last,collapse="")) # concatenate fi

这是一个示例数据帧,我只想使用部分字符串匹配来确定它们是否有任何可以找到重复项的函数

df

数据准备 使用
dplyr
,首先将
first
last
名称连接成一个
整体
名称

library(dplyr)
df1 <- df %>%
          rowwise() %>%              # rowwise operation
          mutate(whole=paste0(name,last,collapse=""))  # concatenate first and last name by row
          ungroup()                  # remove rowwise grouping
分组相似字符串 此递归函数将使用
agrepl
、逻辑近似grep查找相关字符串组,并对它们进行分组和标记
grp
注意字符串之间的差异公差由
max.distance
设置。数字越低,要求就越严格

desired <- NULL
grp <- 1    
special <- function(x, y, grp) {
                if (nrow(y) < 1) {        # if y is empty return data
                     return(x)
                } else {
                     similar <- agrepl(y$whole[1], y$whole, max.distance=0.4)      # find similar occurring strings
                     x <- rbind(x, y[similar,] %>% mutate(grp=grp))    # save similar strings
                     y <- setdiff(y, y[similar,])        # remaining non-similar strings
                     special(x, y, grp+1)       # run function again on non-similar strings
                }
            }

desired <- special(desired, df1, grp)
要摆脱整个

df2 <- df1 %>% select(-whole)
df2%选择(-整型)

非常感谢您的帮助,我还尝试了其他部分文本匹配,如pmach等。
desired <- NULL
grp <- 1    
special <- function(x, y, grp) {
                if (nrow(y) < 1) {        # if y is empty return data
                     return(x)
                } else {
                     similar <- agrepl(y$whole[1], y$whole, max.distance=0.4)      # find similar occurring strings
                     x <- rbind(x, y[similar,] %>% mutate(grp=grp))    # save similar strings
                     y <- setdiff(y, y[similar,])        # remaining non-similar strings
                     special(x, y, grp+1)       # run function again on non-similar strings
                }
            }

desired <- special(desired, df1, grp)
    name   last       whole   grp
1 Joseph  Smith JosephSmith     1
2   Jose  Smith   JoseSmith     1
3 Joseph   Smit  JosephSmit     1
4  Maria   Cruz   MariaCruz     2
5  maria    cru    mariacru     2
6   Mari   Cruz    MariCruz     2
df2 <- df1 %>% select(-whole)