匹配 R 中的无序值
Matching unordered values in R
我正在处理一个包含两列的数据集,如下所示:
df <- data.frame(
Row1 = c("1, 2", "2, 6, 4", "3, 1", "2, 1, 4", "3"),
Row2 = c("2, 5", "2, 6", "1, 3", "1, 4, 2", "3, 2")
)
Row1
Row2
"1, 2"
"2, 5"
"2, 6, 4"
"2, 6"
"3, 1"
"1, 3"
"2, 1, 4"
"1, 4, 2"
"3
"3, 2"
我想要 运行 一个允许我识别 Row2 是否与 Row1 匹配的脚本。需要具有完全相同的值,但它们不需要以相同的顺序排列。所以鉴于以上情况,我想要一个告诉我以下内容的结果:
Row1
Row2
Match
"1, 2"
"2, 5"
FALSE
"2, 6, 4"
"2, 6"
FALSE
"3, 1"
"1, 3"
TRUE
"2, 1, 4"
"1, 4, 2"
TRUE
"3"
"3, 2"
FALSE
我尝试过使用 match() 和 compare(),但都没有成功。只要在 Row2 中找到 Row1 的所有元素,Match() 就会产生 TRUE,但这不是我要找的。当 Row2 具有与 Row1 相同的确切数字并且 only 这些数字时,我需要生成 TRUE only,而不考虑顺序。另一方面,如果我尝试创建一个新列来识别匹配项,Compare() 会产生错误。这是我输入的:
df$match <- compareIgnoreOrder(df$row1, df$row2)
我也试过这种方法:
df$match <- compare(df$row1, df$row2, ignoreAll = TRUE)
这两种方法都会产生以下错误:“输入必须是向量,而不是对象。”在这一点上我被困住了。我到处搜索,但找不到任何解决方案。将不胜感激。
类似于:
data %>%
rowwise() %>%
mutate(Match = length(intersect(Row1,Row2)) == length(union(Row1,Row2)))
输出:
Row1 Row2 Match
<list> <list> <lgl>
1 <dbl [2]> <dbl [2]> FALSE
2 <dbl [3]> <dbl [2]> FALSE
3 <dbl [2]> <dbl [2]> TRUE
4 <dbl [3]> <dbl [3]> TRUE
5 <dbl [1]> <dbl [2]> FALSE
输入:
data <- tibble(
Row1 = list(c(1,2), c(2,6,4), c(3,1), c(2,1,4), c(3)),
Row2 = list(c(2,5), c(2,6), c(1,3), c(1,4,2), c(3,2))
)
你在比较集合,所以像 ?setequal
这样的集合操作对我来说很有意义:
df <- data.frame(
Row1 = c("1, 2", "2, 6, 4", "3, 1", "2, 1, 4", "3"),
Row2 = c("2, 5", "2, 6", "1, 3", "1, 4, 2", "3, 2")
)
do.call(mapply, c(setequal, unname(lapply(df, strsplit, split=",\s+"))))
##[1] FALSE FALSE TRUE TRUE FALSE
或者以一种可能不那么令人困惑的形式,但多了一行:
spl <- lapply(df, strsplit, split=",\s+")
mapply(setequal, spl[[1]], spl[[2]])
##[1] FALSE FALSE TRUE TRUE FALSE
我正在处理一个包含两列的数据集,如下所示:
df <- data.frame(
Row1 = c("1, 2", "2, 6, 4", "3, 1", "2, 1, 4", "3"),
Row2 = c("2, 5", "2, 6", "1, 3", "1, 4, 2", "3, 2")
)
Row1 | Row2 |
---|---|
"1, 2" | "2, 5" |
"2, 6, 4" | "2, 6" |
"3, 1" | "1, 3" |
"2, 1, 4" | "1, 4, 2" |
"3 | "3, 2" |
我想要 运行 一个允许我识别 Row2 是否与 Row1 匹配的脚本。需要具有完全相同的值,但它们不需要以相同的顺序排列。所以鉴于以上情况,我想要一个告诉我以下内容的结果:
Row1 | Row2 | Match |
---|---|---|
"1, 2" | "2, 5" | FALSE |
"2, 6, 4" | "2, 6" | FALSE |
"3, 1" | "1, 3" | TRUE |
"2, 1, 4" | "1, 4, 2" | TRUE |
"3" | "3, 2" | FALSE |
我尝试过使用 match() 和 compare(),但都没有成功。只要在 Row2 中找到 Row1 的所有元素,Match() 就会产生 TRUE,但这不是我要找的。当 Row2 具有与 Row1 相同的确切数字并且 only 这些数字时,我需要生成 TRUE only,而不考虑顺序。另一方面,如果我尝试创建一个新列来识别匹配项,Compare() 会产生错误。这是我输入的:
df$match <- compareIgnoreOrder(df$row1, df$row2)
我也试过这种方法:
df$match <- compare(df$row1, df$row2, ignoreAll = TRUE)
这两种方法都会产生以下错误:“输入必须是向量,而不是对象。”在这一点上我被困住了。我到处搜索,但找不到任何解决方案。将不胜感激。
类似于:
data %>%
rowwise() %>%
mutate(Match = length(intersect(Row1,Row2)) == length(union(Row1,Row2)))
输出:
Row1 Row2 Match
<list> <list> <lgl>
1 <dbl [2]> <dbl [2]> FALSE
2 <dbl [3]> <dbl [2]> FALSE
3 <dbl [2]> <dbl [2]> TRUE
4 <dbl [3]> <dbl [3]> TRUE
5 <dbl [1]> <dbl [2]> FALSE
输入:
data <- tibble(
Row1 = list(c(1,2), c(2,6,4), c(3,1), c(2,1,4), c(3)),
Row2 = list(c(2,5), c(2,6), c(1,3), c(1,4,2), c(3,2))
)
你在比较集合,所以像 ?setequal
这样的集合操作对我来说很有意义:
df <- data.frame(
Row1 = c("1, 2", "2, 6, 4", "3, 1", "2, 1, 4", "3"),
Row2 = c("2, 5", "2, 6", "1, 3", "1, 4, 2", "3, 2")
)
do.call(mapply, c(setequal, unname(lapply(df, strsplit, split=",\s+"))))
##[1] FALSE FALSE TRUE TRUE FALSE
或者以一种可能不那么令人困惑的形式,但多了一行:
spl <- lapply(df, strsplit, split=",\s+")
mapply(setequal, spl[[1]], spl[[2]])
##[1] FALSE FALSE TRUE TRUE FALSE