首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于部分匹配文本对data.frame进行整形和求和(package stringdist)

基于部分匹配文本对data.frame进行整形和求和(package stringdist)
EN

Stack Overflow用户
提问于 2016-03-17 21:20:41
回答 1查看 157关注 0票数 1

我在处理一份旧的名单。这些人的名字写得不同,但实际上,他们是同一个人。我使用stringdist包来计算字符串之间的距离,以查找哪些名称可能相同。

我的数据的一个小示例:

代码语言:javascript
复制
 data <- data.frame(column1 = c("Lalande, Pierre","Lalande, P","Tertre, Girard ","Tertre Girard du"),
                    column2 = c(4, 5, 10, 1))

它提供了什么:

代码语言:javascript
复制
            column1 column2
    Lalande, Pierre       4
         Lalande, P       5
    Tertre, Girard       10
   Tertre Girard du       1

我尝试过的:使用stringdist包

代码语言:javascript
复制
 library (stringdist)
 distance <- stringdistmatrix(data$column1,
                              useNames="strings",
                              method="lv")
 distance2 = as.matrix(distance)

距离<5:准相等字符串

代码语言:javascript
复制
             Lalande, Pierre Lalande, P Tertre, Girard 
Lalande, P                     5                           
Tertre, Girard                11         13                
Tertre Girard du              14         15          3

重塑

代码语言:javascript
复制
library(reshape2)
out <- unique(melt(distance2))

它提供了什么:

代码语言:javascript
复制
           Var1             Var2     value
1   Lalande, Pierre  Lalande, Pierre     0
2        Lalande, P  Lalande, Pierre     5
3   Tertre, Girard   Lalande, Pierre    11
4  Tertre Girard du  Lalande, Pierre    14
5   Lalande, Pierre       Lalande, P     5
6        Lalande, P       Lalande, P     0
7   Tertre, Girard        Lalande, P    13
8  Tertre Girard du       Lalande, P    15
9   Lalande, Pierre  Tertre, Girard     11
10       Lalande, P  Tertre, Girard     13
11  Tertre, Girard   Tertre, Girard      0
12 Tertre Girard du  Tertre, Girard      3
13  Lalande, Pierre Tertre Girard du    14
14  Lalande, P Tertre Girard du         15
15  Tertre, Girard  Tertre Girard du     3
16 Tertre Girard du Tertre Girard du     0

只保留好的几行:

代码语言:javascript
复制
out2 <- out %>%
   filter (value>0 & value<5)
out2

期末考试,但没有我的专栏3!

代码语言:javascript
复制
          Var1             Var2     value
1 Tertre Girard du  Tertre, Girard      3
2  Tertre, Girard  Tertre Girard du     3

如何做到这一点呢?(对我的原始data.frame column2值求和)

代码语言:javascript
复制
Var1            Var2                 Column3(summing)
Lalande, Pierre    Lalande, P               9                
Tertre, Girard    Tertre Girard du         11
EN

回答 1

Stack Overflow用户

发布于 2016-03-17 23:12:58

我确信有一种更干净的方法可以做到这一点,但这在base R中是有效的。

代码语言:javascript
复制
 data <- data.frame(column1 = c("Lalande, Pierre","Lalande, P","Tertre, Girard ","Tertre Girard du"),
               column2 = c(4, 5, 10, 1))

基于模式匹配创建列

代码语言:javascript
复制
 data$column3 <- gsub(",.*| .*",  "", data$column1) 

这里是合并的x部分,我们对第1列和第3列进行拆分和转换

对于合并的y部分,我们通过匹配列3进行聚合

X和y由各自的匹配列合并

代码语言:javascript
复制
  merge(t(unstack(data[c(1,3)])),aggregate(data$column2, by=list(gsub(",.*| .*",  "", data$column1)), FUN=sum), by.x = "row.names", by.y = "Group.1")
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36061784

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档