2016-05-23 31 views
3

我想根据R中的一个普通字符聚合data.frame中的某个值。 问题是我对成对组合的不同方向不感兴趣。 因此,例如成对忽略方向的唯一组合

d = data.frame(x = LETTERS[1:5], y = LETTERS[5:1]) 

    x y 
1 A E 
2 B D 
3 C C 
4 D B 
5 E A 

的组合将被然后计算如下:

d$z <- paste0(d$x,d$y,sep="_") 

的问题是,我不感兴趣的配对差异。所以在这个简单的例子中,A_E应该与E_A相同。

有没有一个聪明的简短的解决方案来粘贴它们?我目前正在考虑在将它们组合成矢量之前对每一个进行排序。

回答

5

一种选择是使用pminpmax

transform(d, z = paste(pmin(x,y), pmax(x,y), sep="_")) 
# x y z 
#1 A E A_E 
#2 B D B_D 
#3 C C C_C 
#4 D B B_D 
#5 E A A_E 

请注意,您可能需要x和y转换为character,如果他们factor秒。


d <- data.frame(x = LETTERS[1:5], y = LETTERS[5:1], stringsAsFactors = FALSE) 
2

这里有一个选择,它有它的工作原理为因素,人物,或基本上任何其他类唯一的优势。

d$z <- apply(d, 1, function(x) paste(sort(x), collapse="_")) 
#> d 
# x y z 
#1 A E A_E 
#2 B D B_D 
#3 C C C_C 
#4 D B B_D 
#5 E A A_E