查找包含在另一列 R 中的列值
Find column value contained in another column R
我有多列地址,其中可能包含重复信息(但通常不会有完全重复的信息)。
以下代码将提供我的问题的示例,
id= c(1, 2)
add1 = c("21ST AVE", "5TH ST")
add2 = c("21ST AVE BLAH ST", "EAST BLAH BLVD")
df = data.frame(id, add1, add2)
df$combined = paste(add1, add2)
df
这给出了以下结果,
id add1 add2 combined
1 1 21ST AVE 21ST AVE BLAH ST 21ST AVE 21ST AVE BLAH ST
2 2 5TH ST EAST BLAH BLVD 5TH ST EAST BLAH BLVD
我需要的结论如下,
id add1 add2 combined
1 1 21ST AVE 21ST AVE BLAH ST 21ST AVE BLAH ST
2 2 5TH ST EAST BLAH BLVD 5TH ST EAST BLAH BLVD
我想确定 add1
中的内容是否包含在 add2
中。如果我发现 add2
包含与 add1
提供的信息相同的信息,那么我要么想避免组合这些特定的列值,要么删除组合列中的重复信息(我认为这需要解决不同的问题字符串中重复短语的问题)。我一直无法找到一个示例来查找 'contained in' 而不是 'exact' 的列值 - 我正在处理一个数据集中超过 500K 个案例,其中这个问题很常见。任何帮助表示赞赏。
我们将split
第二列和第三列乘以一个或多个space(\s+
),然后paste
对应行的union
mapply
创建 'combined'
lst <- lapply(df[2:3], function(x) strsplit(as.character(x), "\s+"))
df$combined <- mapply(function(x,y) paste(union(x, y), collapse=" "), lst$add1, lst$add2)
df$combined
#[1] "21ST AVE BLAH ST" "5TH ST EAST BLAH BLVD"
或者另一个选项是 gsub
gsub("((\w+\s*){2,})\1", "\1", do.call(paste, df[2:3]))
#[1] "21ST AVE BLAH ST" "5TH ST EAST BLAH BLVD"
这是实现此目的的一种方法,其中 ifelse
测试 add1
是否在 add2
中,如果是,则不包含它,否则将它们合并:
id= c(1, 2)
add1 = c("21ST AVE", "5TH ST")
add2 = c("21ST AVE BLAH ST", "EAST BLAH BLVD")
df = data.frame(id, add1, add2, stringsAsFactors = F)
require(stringr)
require(dplyr)
df %>% mutate(combined = ifelse(str_detect(add2, add1),
add2,
str_c(add1, add2)))
输出:
id add1 add2 combined
1 1 21ST AVE 21ST AVE BLAH ST 21ST AVE BLAH ST
2 2 5TH ST EAST BLAH BLVD 5TH STEAST BLAH BLVD
我有多列地址,其中可能包含重复信息(但通常不会有完全重复的信息)。
以下代码将提供我的问题的示例,
id= c(1, 2)
add1 = c("21ST AVE", "5TH ST")
add2 = c("21ST AVE BLAH ST", "EAST BLAH BLVD")
df = data.frame(id, add1, add2)
df$combined = paste(add1, add2)
df
这给出了以下结果,
id add1 add2 combined
1 1 21ST AVE 21ST AVE BLAH ST 21ST AVE 21ST AVE BLAH ST
2 2 5TH ST EAST BLAH BLVD 5TH ST EAST BLAH BLVD
我需要的结论如下,
id add1 add2 combined
1 1 21ST AVE 21ST AVE BLAH ST 21ST AVE BLAH ST
2 2 5TH ST EAST BLAH BLVD 5TH ST EAST BLAH BLVD
我想确定 add1
中的内容是否包含在 add2
中。如果我发现 add2
包含与 add1
提供的信息相同的信息,那么我要么想避免组合这些特定的列值,要么删除组合列中的重复信息(我认为这需要解决不同的问题字符串中重复短语的问题)。我一直无法找到一个示例来查找 'contained in' 而不是 'exact' 的列值 - 我正在处理一个数据集中超过 500K 个案例,其中这个问题很常见。任何帮助表示赞赏。
我们将split
第二列和第三列乘以一个或多个space(\s+
),然后paste
对应行的union
mapply
创建 'combined'
lst <- lapply(df[2:3], function(x) strsplit(as.character(x), "\s+"))
df$combined <- mapply(function(x,y) paste(union(x, y), collapse=" "), lst$add1, lst$add2)
df$combined
#[1] "21ST AVE BLAH ST" "5TH ST EAST BLAH BLVD"
或者另一个选项是 gsub
gsub("((\w+\s*){2,})\1", "\1", do.call(paste, df[2:3]))
#[1] "21ST AVE BLAH ST" "5TH ST EAST BLAH BLVD"
这是实现此目的的一种方法,其中 ifelse
测试 add1
是否在 add2
中,如果是,则不包含它,否则将它们合并:
id= c(1, 2)
add1 = c("21ST AVE", "5TH ST")
add2 = c("21ST AVE BLAH ST", "EAST BLAH BLVD")
df = data.frame(id, add1, add2, stringsAsFactors = F)
require(stringr)
require(dplyr)
df %>% mutate(combined = ifelse(str_detect(add2, add1),
add2,
str_c(add1, add2)))
输出:
id add1 add2 combined
1 1 21ST AVE 21ST AVE BLAH ST 21ST AVE BLAH ST
2 2 5TH ST EAST BLAH BLVD 5TH STEAST BLAH BLVD