2016-05-23 26 views
1

我有一個data.frame,每行代表n個樣本的成對組合的值。我怎麼能擴大這個基本上得到每個組合的'expand.grid',但維護給定對的值,並給予具有相同樣本的行的值爲1? 我的目標是將這些繪製在「相關矩陣」風格圖(例如plots)中。不知道是否有更簡單的方法來做到這一點。繪圖combn值

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,..)中設置的「鑰匙」的列,交叉連接,對於具有在「V1」和「V2」(V1==V2)相同值的行,設定「值」作爲1.根據相同列中'V1','V2'和pminpmax進行分組,取代'值'作爲'值'中的非NA值。

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