将有向对偶转化为无向对偶

Transforming directed dyads into undirected

这对我来说似乎是一个基本问题,我几乎可以肯定它一定会在附近的某个地方被覆盖,但我已经搜索了很长时间但似乎找不到合适的回答。

我的数据是这样的:

data <- data.frame(col1 = c("A","A","B","B"), col2 = c("B","C","A","C"), value = c(1,2,3,4))

    col1 col2 value
1    A    B    1
2    A    C    2
3    B    A    3
4    B    C    4

我想将 col1 和 col2 合并到一个变量中,该变量指示单个向量中的唯一二元组。 "A" 和 "B" 是 col1 还是 col2 的值应该无关紧要。在 col1 和 col2 中组合包含 "A" 和 "B" 的每一行都应该获得相同的新变量值。我尝试为此使用 tidyr。

unite(data, col1, col2, col="dyad", sep="_")

returns

  dyad value
1  A_B    1
2  A_C    2
3  B_A    3
4  B_C    4

基本上,我需要 dyad 为 A_B 和 B_A 包含相同的值,因为这些对对我来说是等价的。它应该是这样的,例如:

  dyad value
1  A_B    1
2  A_C    2
3  A_B    3
4  B_C    4

有没有简单的方法来做到这一点?非常感谢!

可能有更优雅的解决方案,但也许这会有所帮助:

data <- data.frame(col1 = c("A","A","B","B"), col2 = c("B","C","A","C"), value = c(1,2,3,4),
               stringsAsFactors = FALSE)     
data$dyad <- apply(data[,c("col1","col2")], 1, FUN= function(x) paste(sort(x), collapse="_"))

因此应用函数确保函数应用于数据框的每一行。该函数首先对输入进行排序,然后将它们粘贴在一起。

编辑:我从其他答案中复制了 stringsAsFactors = FALSE,因为我也使用过它,但忘记将其包含在我的 post :)

使用 dplyr 的解决方案。请注意,我在创建数据框时添加了 stringsAsFactors = FALSE,因为在这种情况下最好处理字符列。

data <- data.frame(col1 = c("A","A","B","B"), col2 = c("B","C","A","C"), value = c(1,2,3,4),
                   stringsAsFactors = FALSE) 

library(dplyr)

data2 <- data %>%
  rowwise() %>%
  mutate(dyad = paste(sort(c(col1, col2)), collapse = "_")) %>%
  select(dyad, value) %>%
  ungroup()
data2
# # A tibble: 4 x 2
#    dyad value
#   <chr> <dbl>
# 1   A_B     1
# 2   A_C     2
# 3   A_B     3
# 4   B_C     4