我有两个数据帧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)
这里是使用data.table
和setkey
(来自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
是通过引用工作的,因此整个过程确实非常快。代码的最后一行将key
的D1
的条目与key
的D2
的条目匹配,并返回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_Cause
的D3
列为c(NA, 'R3', 'R2', 'R3')
,这是不正确的-默认情况下,A,H
与H,A
不同,这就是R2
不匹配的原因。其次,CI,E
与样本数据中的R4
中的D2
相匹配。
您始终可以通过将列设置为NULL
来删除列,例如Customer := NULL
并使用setcolorder()
重新排序列。