6

2 つのベクトルがあるとします。

a <- c("george", "harry", "harry", "chris", "steve", "steve", "steve", "harry")
b <- c("harry", "steve", "chris", "harry", "harry", "george", "chris", "george")

私がやりたいのは、1番目のペア、2番目のペアなどを貼り付けることです.....ただし、各ペアの2つの要素をアルファベット順に貼り付けたいです。上記の例では、最初の 2 つのペアは既にアルファベット順になっていますが、3 番目のペア 'harry' と 'chris' はそうではありません。このペアには「クリス・ハリー」を返したい。

これを2ステップのプロセスで行う方法を考え出しましたが、これを行うための簡単な方法(1行の方法)があるかどうか疑問に思っていましたpasteか?

私の解決策:

x <- apply(mapply(c, a, b, USE.NAMES = FALSE), 2, sort)
paste(x[1,], x[2,])

これはアルファベット順にペアを与えます...しかし、1行の方法はありますか?

[1] "george harry" "harry steve"  "chris harry"  "chris harry"  "harry steve"  "george steve" "chris steve"  "george harry"
4

5 に答える 5

6

2 回ソートされるため少し冗長ですが、ベクトル化されます。

paste(pmin(a,b), pmax(a,b))

ifelse編集:、との代替

ifelse(a < b, paste(a, b), paste(b, a))
于 2014-08-31T18:54:02.187 に答える
1

これは Tyler の方法と似ていますが、Map. 技術的にはワンライナーです...

unlist(Map(function(x,y) {
    paste(sort(c(x,y)), collapse = " ")
    }, a, b, USE.NAMES = FALSE))
# [1] "george harry" "harry steve"  "chris harry"  "chris harry" 
# [5] "harry steve"  "george steve" "chris steve"  "george harry"
于 2014-08-31T02:34:27.217 に答える
1

独自のコードからの 1 つのライナー:

apply(data.frame(apply(mapply(c, a, b, USE.NAMES = FALSE),1,paste)),1,function(x) paste(x[1],x[2]))
[1] "george harry" "harry steve"  "harry chris"  "chris harry"  "steve harry"  "steve george" "steve chris"  "harry george"


apply(apply(mapply(c, a, b, USE.NAMES = FALSE),2,sort),1,paste)

     [,1]     [,2]   
[1,] "george" "harry"
[2,] "harry"  "steve"
[3,] "chris"  "harry"
[4,] "chris"  "harry"
[5,] "harry"  "steve"
[6,] "george" "steve"
[7,] "chris"  "steve"
[8,] "george" "harry"
于 2014-08-31T16:45:36.600 に答える