我的数据如下:
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
有一种简单的方法吗?非常感谢!
答案 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