我正在 R 工作,如果可能的话,我更喜欢 dplyr 解决方案。
样本数据:
data.frame(
col1 = c("a", "b", "c", "d"),
col2 = c("a", "b", "d", "a"),
col3 = rep("a", 4L),
col4 = c("a", "b", "d", "a"),
col5 = c("a", "a", "c", "d"),
col6 = rep(c("b", "a"), each = 2L)
)
第 1 列 | 列2 | 第 3 列 | 第 4 列 | 第5栏 | 第 6 栏 |
---|---|---|---|---|---|
A | A | A | A | A | 乙 |
乙 | 乙 | A | 乙 | A | 乙 |
C | d | A | d | C | A |
d | A | A | A | d | A |
问题
我想知道每一行的col1、 col2和col3是否与col4、col5和col6相同,但应忽略 col1 - col3 和 col4 - col6 的顺序。
因此,对于第 1 行,如果 col1 - col3 分别包含 a、a、b,并且 col4 - col6 分别包含 b、a、a,则将被视为匹配。
期望的结果
在“评估”栏中添加注释以帮助理解
第 1 列 | 列2 | 第 3 列 | 第 4 列 | 第5栏 | 第 6 栏 | 评估 |
---|---|---|---|---|---|---|
A | A | A | A | A | 乙 | FALSE(因为 1-3 与 4-6 不同) |
乙 | 乙 | A | 乙 | A | 乙 | TRUE(因为 1-3 与 4-6 相同,如果忽略顺序) |
C | d | A | d | C | A | TRUE(因为 1-3 与 4-6 相同,如果忽略顺序) |
d | A | A | A | d | A | TRUE(因为 1-3 与 4-6 相同,如果忽略顺序) |
基础R:
可重现的数据:
PS:为什么用table()和indentical而不是sort()、==、all()?我希望它能够随着列数的增加而更好地扩展(假设唯一值的数量较少)。例子:
PS 2:替换
table(x)
为collapse::fcount(x, sort = TRUE)
可大幅提升速度。使用 dplyr 您可以执行以下操作:
避免迭代行
通常,迭代行很慢,并且我发现
dplyr::rowwise()
超过几千行的方法变得非常慢。它的使用速度往往更快,purrr::pmap()
并且迭代列的速度也更快。基本 R 方法
您可以转置相关列并迭代该列。
tidyverse
方法:从宽转长或者,如果您想保留在
tidyverse
您可以从宽转换为长:这比较冗长,但我怀疑对于任何大小合理的数据集来说,它会快得多。
在基本 R 中,您可以使用
vapply
andsort
:输出:
正如已经指出的,您应该避免行操作。这是一种使用辅助函数来比较集合的替代方案,该函数可以按行有效排序,以便比较完全矢量化。
A
dplyr
和vecsets
选项可以是:与以下内容相同的想法
purrr::pmap()
:这是一个不合理的低效解决方案,但出于好奇:
与以下内容相同的想法
purrr:pmap()
:使用 @SamR 的转置逻辑
vecsets
:使用相同的方法
data.table::transpose()
:split.default
用+尝试下面的代码colMeans
这应该给
这句话虽然很啰嗦,但我无法抗拒。这是一个带有旋转功能的: