将有向对偶转化为无向对偶
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
这对我来说似乎是一个基本问题,我几乎可以肯定它一定会在附近的某个地方被覆盖,但我已经搜索了很长时间但似乎找不到合适的回答。
我的数据是这样的:
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