2016-05-23 5 views
1

私は、各行がn個のサンプルのペアごとの組み合わせの値を表すdata.frameを持っています。これを拡張して、基本的に各組み合わせの 'expand.grid'を得ることができますが、与えられたペアの値を保持し、同じサンプルの行に対して1の値を与えますか? 私の目的は、これらを「相関行列」スタイルプロット(例えば、plots)にプロットすることです。より簡単な方法があるかどうかはわかりません。コームの値をプロットする

set.seed(123) 
n <- 3 
d <- as.data.frame(t(combn(letters[1:n], m = 2)), stringsAsFactors = FALSE) 
d$value <- rnorm(nrow(d)) 
d 
## V1 V2  value 
## 1 a b -0.5604756 
## 2 a c -0.2301775 
## 3 b c 1.5587083 

e <- expand.grid(letters[1:n], letters[1:n]) 
#e$value <- ?? 
# a-a, b-b, c-c will be e.g. 1 
# a-b and b-a will be -0.5604 
# a-c and c-a will be -0.2301 
# b-c and c-b will be 1.5587 

e 
## Var1 Var2 
## 1 a a 
## 2 b a 
## 3 c a 
## 4 a b 
## 5 b b 
## 6 c b 
## 7 a c 
## 8 b c 
## 9 c c 

答えて

2

ここにはdata.tableを使用するオプションがあります。 'data.frame'を 'data.table'(setDT(d,..)に変換し、 'key'列を設定し、 'V1'と 'V2'(V1==V2)に同じ値を持つ行をクロス結合し、 'value'を1.同じ列の 'V1'、 'V2'、およびpminpmaxでグループ化し、 'value'の非NA値として 'value'を置き換えます。

library(data.table) 
d1 <- setDT(d, key = c("V1", "V2"))[CJ(letters[1:n], letters[1:n])][ 
V1==V2, value:= 1][, value:= na.omit(value) , .(pmax(V1, V2), pmin(V1, V2))][] 
d1 
# V1 V2  value 
#1: a a 1.0000000 
#2: a b -0.5604756 
#3: a c -0.2301775 
#4: b a -0.5604756 
#5: b b 1.0000000 
#6: b c 1.5587083 
#7: c a -0.2301775 
#8: c b 1.5587083 
#9: c c 1.0000000 
関連する問題