2017-12-03 4 views
0

これは私にとっての基本的な質問のように思えますが、私はそれをここのどこかでカバーしなければならないとほとんど確信していますが、正しい答えを見つける。指示されたダイアドを無指向に変える

私のデータは次のようになります。

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"を含む各行は、新しい変数の同じ値を取得する必要があります。私はこのために整頓を使いました。これらのペアは私のために同等であるため、

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 

は基本的に、私は、A_BとB_Aに同じ値を含むようにダイアドを必要としています。これは、次のようになります。

dyad value 
1 A_B 1 
2 A_C 2 
3 A_B 3 
4 B_C 4 

これは簡単な方法ですか?どうもありがとう!

答えて

0

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 
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="_")) 

だから適用関数は、関数は、データフレームの各行に適用されることを保証します。この関数はまず入力をソートし、それらを一緒に貼り付けます。

編集:私は、私は同様にそれを使用して、他の回答からstringsAsFactors = FALSEをコピーしたが、私のポストに含めるのを忘れて:)

関連する問題