比较字符串将差异提取到新列R中

时间:2018-10-16 20:16:30

标签: r string character string-matching

标题可能听起来令人困惑,想法更简单。

我正在尝试比较地址数据。同一个人有多个地址,需要进行比较。如果它们相等,那就太好了。如果不是,那么我需要将不同之处提取到新列中。

下面有创建DF的数据。然后,我使用包裹在mapply中的charmatch在两个方向上将addr2与addr1进行比较;如果有任何差异,则addr_compX_Y列=1。

<link href="https://use.fontawesome.com/releases/v5.4.1/css/all.css" rel="stylesheet"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.min.js"></script>
<div id="app">
  <button @click="addFa($event)" v-for="word in words">{{word}}</button>
  <button @click="changeData()">Change data</button>
</div>

理想的最终结果数据帧看起来像第二组示例数据。如果addr_compX_Y不等于1,我会添加一些提取不同之处的东西。

eg_data <- data.frame(
addr1 = c('123 Main St','742 Evergreen Ter','8435 Roanoke Dr','1340 N State Pkwy') , 
addr2 = c('123 Main St Apt 4','742 Evergreen Terrace','8435 Roanoke Dr Unit 5','1340 N State Pkwy')) 
eg_data$addr_comp1_2 <- mapply(charmatch, eg_data$addr1, eg_data$addr2)
eg_data$addr_comp2_1 <- mapply(charmatch, eg_data$addr2, eg_data$addr1)

我知道如何比较,我知道如何提取,但是我不确定如何同时执行它们。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

这就是我使用称为vecsets的库的方式:

library(vecsets)
eg_data <- data.frame(
  addr1 = c('123 Main St','742 Evergreen Ter','8435 Roanoke Dr','1340 N State Pkwy') , 
  addr2 = c('123 Main St Apt 4','742 Evergreen Terrace','8435 Roanoke Dr Unit 5','1340 N State Pkwy'),
  stringsAsFactors=FALSE) 
eg_data$addr_diff1_2 <- mapply(vsetdiff, strsplit(eg_data$addr1, split = ""),
                              strsplit(eg_data$addr2, split = ""))
eg_data$addr_diff2_1 <- mapply(vsetdiff, strsplit(eg_data$addr2, split = ""),
                               strsplit(eg_data$addr1, split = ""))

输出字符列表:

              addr1                  addr2 addr_diff1_2        addr_diff2_1
1       123 Main St      123 Main St Apt 4                  , A, p, t,  , 4
2 742 Evergreen Ter  742 Evergreen Terrace                       r, a, c, e
3   8435 Roanoke Dr 8435 Roanoke Dr Unit 5               , U, n, i, t,  , 5
4 1340 N State Pkwy      1340 N State Pkwy