r - R 中的唯一对,忽略顺序

标签 r

假设我有一个这样的数据框:

dat<-data.frame(c("a", "b", "c"), c("b", "a", "d"), stringsAsFactors=F)
colnames(dat)<-c("V1", "V2")
dat
#    V1  V2
# 1   a   b
# 2   b   a
# 3   c   d

我想要做的是,每一行都是一对,生成所有唯一的对,忽略顺序。所以我的输出会是这样的
unique_pairs(dat$V1, dat$V2)

# Output
#   V1  V2
# 1  a   b
# 2  c   d

这样做的最有效方法是什么?

最佳答案

一种选择(由@bgoldst 回答)是使用 apply 单独对每一行进行排序。但是,对于使用对 pminpmax 的单个调用而不是在使用多次调用 sort 的行上操作的大型数据帧,我们将获得更好的性能:

# Make a larger data frame by sampling
set.seed(144)
dat.large <- dat[sample(nrow(dat), 10000, replace=T),]

# Row-wise and column-wise computations
rowwise <- function(dat) unique(t(apply(dat, 1, sort)))
colwise <- function(dat) unique(cbind(pmin(dat[,1], dat[,2]), pmax(dat[,1], dat[,2])))
all.equal(unname(rowwise(dat.large)), unname(colwise(dat.large)))
# [1] TRUE

# Compare performance
library(microbenchmark)
microbenchmark(rowwise(dat.large), colwise(dat.large))
# Unit: milliseconds
#                expr       min        lq      mean    median        uq      max neval
#  rowwise(dat.large) 465.45604 523.49464 564.91541 559.14461 595.58961 805.7982   100
#  colwise(dat.large)  33.69199  42.91692  50.87839  47.70415  53.06705 122.4459   100

如您所见,对于 10000 行输入,按列操作的速度大约快 10 倍,这显示了在 R 中计算时向量化的强大功能。显然,从 500 毫秒到 50 毫秒的加速可能不是什么大问题,但如果您在处理大型数据集时,矢量化方法可能更可取。

关于r - R 中的唯一对,忽略顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28284656/

相关文章:

从字符串中删除相邻的重复项

r - 剪切列并将其与 r 中的数据框进行 rbind

html - 如何突出显示 .qmd html 文件中的特定代码行

R - 计算 Shiny 下载按钮的点击次数

r - 如何安装多个包?

R - 根据当前行和其他行中的值向数据框添加计数

r - 如何使用 dplyr 中的 "between"函数向数据帧添加唯一标识符

r - 在自定义函数中使用 mutate 以突变条件作为参数

r - 使用 R 进行 3D 可视化

r - 使用 R 包 sf 编写带坐标的 CSV