R 将有向二元体转换为无向二元体

R 将有向二元体转换为无向二元体,r,tidyr,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

对我来说,这似乎是一个基本的问题,我几乎可以肯定它一定会在这里的某个地方被提及,但我已经寻找了很长一段时间,似乎找不到正确的答案

我的数据如下所示:

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
返回

  dyad value
1  A_B    1
2  A_C    2
3  B_A    3
4  B_C    4
基本上,我需要二元来包含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="_"))
因此,apply函数确保该函数应用于数据帧的每一行。函数首先对输入进行排序,然后将它们粘贴在一起

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

一个使用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
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