在 tibble 中保持唯一的、非重复的行

Keeping unique, non-repetitive rows in a tibble

我的 cor_test() 调用产生大量重复输出。例如,mpg cyl 实际上与 cyl mpg 相同。另外,我希望在整个过程中消除任何变量与其自身(例如 mpg mpg)的相关性。

我们能否将输出限制为唯一的、非重复的行?

(注意:这是一个玩具示例。感谢实用的答案。)

library(rstatix)
library(tidyverse)

mtcars %>% cor_test(mpg:disp)

1 mpg   mpg    1       Inf    0.          1         1     Pearson  
2 mpg   cyl   -0.85     -8.92 6.11e-10   -0.926    -0.716 Pearson  #
3 mpg   disp  -0.85     -8.75 9.38e-10   -0.923    -0.708 Pearson
4 cyl   mpg   -0.85     -8.92 6.11e-10   -0.926    -0.716 Pearson  #
5 cyl   cyl    1       Inf    0.          1         1     Pearson  
6 cyl   disp   0.9      11.4  1.80e-12    0.807     0.951 Pearson  
7 disp  mpg   -0.85     -8.75 9.38e-10   -0.923    -0.708 Pearson
8 disp  cyl    0.9      11.4  1.80e-12    0.807     0.951 Pearson
9 disp  disp   1       Inf    0.          1         1     Pearson

您可以使用 pmin/pmax 对列进行排序,然后使用 distinct 只保留唯一的行。我们可以为此编写一个函数。

library(dplyr)
library(rstatix)

delete_duplicates <- function(data) {
  data %>%
    filter(var1 != var2) %>%
    mutate(col1 = pmin(var1, var2),
           col2 = pmax(var1, var2)) %>%
    distinct(col1, col2, .keep_all = TRUE) %>%
    select(-col1, -col2)
}

并将其传递给 cor_test 输出。

mtcars %>% 
  cor_test(mpg:disp) %>%
  delete_duplicates()


#  var1  var2    cor statistic        p conf.low conf.high method 
#  <chr> <chr> <dbl>     <dbl>    <dbl>    <dbl>     <dbl> <chr>  
#1 mpg   cyl   -0.85     -8.92 6.11e-10   -0.926    -0.716 Pearson
#2 mpg   disp  -0.85     -8.75 9.38e-10   -0.923    -0.708 Pearson
#3 cyl   disp   0.9      11.4  1.80e-12    0.807     0.951 Pearson

使用base R

out <- cor_test(subset(mtcars, select = mpg:disp))
out[!duplicated(t(apply(out[c('var1', 'var2')], 1, sort))) & 
         out$var1 != out$var2,]
# A tibble: 3 x 8
#  var1  var2    cor statistic        p conf.low conf.high method 
#  <chr> <chr> <dbl>     <dbl>    <dbl>    <dbl>     <dbl> <chr>  
#1 mpg   cyl   -0.85     -8.92 6.11e-10   -0.926    -0.716 Pearson
#2 mpg   disp  -0.85     -8.75 9.38e-10   -0.923    -0.708 Pearson
#3 cyl   disp   0.9      11.4  1.80e-12    0.807     0.951 Pearson