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