r中的字符串匹配

问题描述 投票:0回答:1

我有两个数据帧D1和D2,如下所述我想将D1的“问题”与D2的“ list_of_issues”比较D1和D2

`ID = c(1, 2, 3, 4)
Issues = c('CI', 'E,CI', 'H,A', 'CI,E')
Location = c('x', 'y', 'z', 'w')
Customer = c('a', 'b', 'c', 'd')
D1 = data.frame(ID, Issues, Location, Customer)`

Root_Cause = c('R1', 'R2', 'R3', 'R4')
List_of_Issues = c('A', 'A,H', 'E,CI', 'CI,E')  
D2 = data.frame(Root_Cause, List_of_Issues)

如果问题与根本原因匹配,则在D3中通过生成列“ Root_Cause”这样在D3中获得Root_causeID = c(1, 2, 3, 4) Issues = c('CI', 'E,CI', 'H,A', 'CI,E') Location = c('x', 'y', 'z', 'w') Customer = c('a', 'b', 'c', 'd') Root_Cause = c(NA, 'R3', 'R2', 'R3') D3 = data.frame(ID, Issues, Location, Customer, Root_Cause)

r text character string-matching mining
1个回答
0
投票

这里是使用data.tablesetkey(来自data.table)的快速修复。

library(data.table) 
D1 <- as.data.table(D1)
setkey(D1, 'Issues') 

D2 <- as.data.table(D2) 
setkey(D2, 'List_of_Issues)

> D1
   ID Issues Location Customer
1:  1     CI        x        a
2:  4   CI,E        w        d
3:  2   E,CI        y        b
4:  3    H,A        z        c
> D2
   Root_Cause List_of_Issues
1:         R1              A
2:         R2            A,H
3:         R4           CI,E
4:         R3           E,CI

# Using the key to get the desired output
> D2[D1, ]
   Root_Cause List_of_Issues ID Location Customer
1:       <NA>             CI  1        x        a
2:         R4           CI,E  4        w        d
3:         R3           E,CI  2        y        b
4:       <NA>            H,A  3        z        c

设置key可使data.table在该列上快速排序。由于data.table是通过引用工作的,因此整个过程确实非常快。代码的最后一行将keyD1的条目与keyD2的条目匹配,并返回Root_Cause以匹配两个key中的tables条目。

可以通过ID进行排序以获得所需的输出:

> D2[D1, ][order(ID)]
   Root_Cause List_of_Issues ID Location Customer
1:       <NA>             CI  1        x        a
2:         R3           E,CI  2        y        b
3:       <NA>            H,A  3        z        c
4:         R4           CI,E  4        w        d

在您的示例中,Root_CauseD3列为c(NA, 'R3', 'R2', 'R3'),这是不正确的-默认情况下,A,HH,A不同,这就是R2不匹配的原因。其次,CI,E与样本数据中的R4中的D2相匹配。

您始终可以通过将列设置为NULL来删除列,例如Customer := NULL并使用setcolorder()重新排序列。

© www.soinside.com 2019 - 2024. All rights reserved.