在 R 中,有没有办法在数据框中的两列中识别相似的字符串值?
In R, is there a way to identify similar string values in two columns in a dataframe?
我有一个包含 70,000 个观察值的大型数据框,其中 A 列和 B 列有成对的护士和医生在同一个班次一起工作。不幸的是,这里和那里有一些观察(我不能完全估计有多少,但它是少数),他们在 A 列和 B 列中是同一个人,但由于添加了中间名或他们的名字拼写略有不同一栏中的昵称,但另一栏中没有。我想创建一个只有这些行的数据框。有没有办法使用 %like% 和哪个函数或类似的东西来识别所有这些行?
这是我的例子:
A
B
Jimmy Fallon
Harry Potter
Jimmy Fallon
James Fallon
Harry Potter
John Oliver
Harry Potter
Harold Potter
我想要的:
A
B
Jimmy Fallon
James Fallon
Harry Potter
Harold Potter
一个可能的选择是对距离较近的行使用 adist
然后 filter
。这种方法假设每一列中都有一个公共元素(例如,姓氏)。
library(tidyverse)
df %>%
rowwise() %>%
filter(adist(x=A,y=B,ignore.case=TRUE) <= 3)
输出
A B
<chr> <chr>
1 Jimmy Fallon James Fallon
2 Harry Potter Harold Potter
或以 R 为基数:
df[subset(t(t(mapply(adist, df$A, df$B))) <= 3),]
数据
df <- structure(list(A = c("Jimmy Fallon", "Jimmy Fallon", "Harry Potter",
"Harry Potter"), B = c("Harry Potter", "James Fallon", "John Oliver",
"Harold Potter")), class = "data.frame", row.names = c(NA, -4L
))
确定截止值
您可能需要根据您的数据更改截止过滤值。但是,当名称略有拼写错误时,您可以获得距离并找到最佳截止点。
df2 <- data.frame(A = c("Jimmy Fallon", "Jimmy Fallon", "Harry Potter", "Hary Poter"),
B = c("Harry Potter", "James Fallo", "John Oliver", "Harold Potter"))
df %>%
rowwise() %>%
mutate(dist = adist(x=A,y=B,ignore.case=TRUE)) %>%
as.data.frame %>%
arrange(dist)
A B dist
1 Jimmy Fallon James Fallo 4
2 Hary Poter Harold Potter 4
3 Harry Potter John Oliver 9
4 Jimmy Fallon Harry Potter 10
所以,现在我们知道 4 是更好的过滤截止值。
我有一个包含 70,000 个观察值的大型数据框,其中 A 列和 B 列有成对的护士和医生在同一个班次一起工作。不幸的是,这里和那里有一些观察(我不能完全估计有多少,但它是少数),他们在 A 列和 B 列中是同一个人,但由于添加了中间名或他们的名字拼写略有不同一栏中的昵称,但另一栏中没有。我想创建一个只有这些行的数据框。有没有办法使用 %like% 和哪个函数或类似的东西来识别所有这些行?
这是我的例子:
A | B |
---|---|
Jimmy Fallon | Harry Potter |
Jimmy Fallon | James Fallon |
Harry Potter | John Oliver |
Harry Potter | Harold Potter |
我想要的:
A | B |
---|---|
Jimmy Fallon | James Fallon |
Harry Potter | Harold Potter |
一个可能的选择是对距离较近的行使用 adist
然后 filter
。这种方法假设每一列中都有一个公共元素(例如,姓氏)。
library(tidyverse)
df %>%
rowwise() %>%
filter(adist(x=A,y=B,ignore.case=TRUE) <= 3)
输出
A B
<chr> <chr>
1 Jimmy Fallon James Fallon
2 Harry Potter Harold Potter
或以 R 为基数:
df[subset(t(t(mapply(adist, df$A, df$B))) <= 3),]
数据
df <- structure(list(A = c("Jimmy Fallon", "Jimmy Fallon", "Harry Potter",
"Harry Potter"), B = c("Harry Potter", "James Fallon", "John Oliver",
"Harold Potter")), class = "data.frame", row.names = c(NA, -4L
))
确定截止值
您可能需要根据您的数据更改截止过滤值。但是,当名称略有拼写错误时,您可以获得距离并找到最佳截止点。
df2 <- data.frame(A = c("Jimmy Fallon", "Jimmy Fallon", "Harry Potter", "Hary Poter"),
B = c("Harry Potter", "James Fallo", "John Oliver", "Harold Potter"))
df %>%
rowwise() %>%
mutate(dist = adist(x=A,y=B,ignore.case=TRUE)) %>%
as.data.frame %>%
arrange(dist)
A B dist
1 Jimmy Fallon James Fallo 4
2 Hary Poter Harold Potter 4
3 Harry Potter John Oliver 9
4 Jimmy Fallon Harry Potter 10
所以,现在我们知道 4 是更好的过滤截止值。