2016-05-23 28 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