将定向二元变换为无向{d}

时间:2017-12-03 16:15:49

标签: r tidyr

对我来说,这似乎是一个基本问题,我几乎可以肯定它必须覆盖在这里的某个地方,但我现在已经搜索了很长一段时间,似乎无法找到正确的答案。

我的数据如下:

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的值都无关紧要。包含“A”和“B”的每一行在col1和col2中组合应该得到新变量的相同值。我尝试使用tidyr。

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

返回

  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

有一种简单的方法吗?非常感谢!

2 个答案:

答案 0 :(得分:1)

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

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="_"))

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

编辑:我从另一个答案中复制了stringsAsFactors = FALSE,因为我也使用了它,但忘记将其包含在我的帖子中:)

答案 1 :(得分:0)

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

stringsAsFactors = FALSE