在 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
我的 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