如何选择 R 数据框中两列的所有唯一组合?

Jos*_*use 2 r dplyr tidyr

我有一个相关矩阵,我把它放在一个数据框中,如下所示:

row | var1 | var2 | cor
1   | A    | B    | 0.6
2   | B    | A    | 0.6
3   | A    | C    | 0.4
4   | C    | A    | 0.4
Run Code Online (Sandbox Code Playgroud)

这些结果每行复制到 2 行,同时包含“var1”和“var2”。我只需要一个,最好先使用较低的变量(例如第 1 行和第 3 行)。

我一直在玩 dplyr 两个小时并阅读旧线程,但没有找到我需要的东西。

# get correlation of every concept versus every concept
data.cor <- data.jobs %>% 
  select(-y,-X) %>%
  as.matrix %>%
  cor %>%
  as.data.frame %>%
  rownames_to_column(var = 'var1') %>%
  gather(var2, value, -var1)
Run Code Online (Sandbox Code Playgroud)

我希望输出看起来像这样:

row | var1 | var2 | cor
1   | A    | B    | 0.6
3   | A    | C    | 0.4
Run Code Online (Sandbox Code Playgroud)

我试图在不诉诸循环的情况下做到这一点。

Shr*_*ree 7

这是一种方法tidyverse-

dat2 <- dat %>% 
  filter(!duplicated(paste0(pmax(var1, var2), pmin(var1, var2))))


# A tibble: 2 x 3
  var1  var2    cor
  <chr> <chr> <dbl>
1 A     B     0.600
2 A     C     0.400
Run Code Online (Sandbox Code Playgroud)

数据 -

dat <- data_frame(
  var1 = LETTERS[c(1,2,1,3)],
  var2 = LETTERS[c(2,1,3,1)],
  cor = c(0.6,0.6,0.4,0.4))
Run Code Online (Sandbox Code Playgroud)

注意:由于@tmfmnk 清理了逻辑


www*_*www 5

使用的解决方案tidyverse

library(tidyverse)

dat2 <- dat %>%
  mutate(Var = map2_chr(var1, var2, ~toString(sort(c(.x, .y))))) %>%
  distinct(Var, .keep_all = TRUE) %>%
  select(-Var)
dat2
#   row var1 var2 cor
# 1   1    A    B 0.6
# 2   3    A    C 0.4
Run Code Online (Sandbox Code Playgroud)

数据

dat <- read.table(text = "row | var1 | var2 | cor
1   | A    | B    | 0.6
2   | B    | A    | 0.6
3   | A    | C    | 0.4
4   | C    | A    | 0.4",
                  sep = "|", stringsAsFactors = FALSE, header = TRUE, strip.white = TRUE)
Run Code Online (Sandbox Code Playgroud)