如何只获得变量的唯一组合,其中条目可以在任一变量中

时间:2014-05-30 00:23:11

标签: r

鉴于我们已经

j<-c("a","b","c","d")  
l<-expand.grid(j,j)

print(l)

Var1 Var2
1     a    a
2     b    a
3     c    a
4     d    a
5     a    b
6     b    b
7     c    b
8     d    b
9     a    c
10    b    c
11    c    c
12    d    c
13    a    d
14    b    d
15    c    d
16    d    d

我想只返回唯一的条目,例如:

print(newl)
Var1 Var2
a    a
a    b
a    c
a    d
b    b
b    c
b    d
c    c
c    d
d    d

我找到了许多答案,其中包含变量的唯一组合,但变量不会跨越列。

这一切都来自于做corr.test {psych}并使用as.vector(corr.test $ r)将corr.test $ r展开到单个向量中。

要获得那些基于我使用的相关性

names<-expand.grid(rownames(corr.test$r),colnames(corr.test$r))

最终与“展开”的结构保持一致。来自as.vector的r矩阵。

但它返回整个矩阵(上下三角形)。所以我正在寻找一种方法来只采用唯一的相关性(data.frame的一半)。

4 个答案:

答案 0 :(得分:4)

combn函数会为您提供所有n - 向量中元素的组合,但它与自身的元素不匹配。您可以非常轻松地添加该结果,因此您可以使用

获得所需的组合
cbind(combn(j,2), rbind(j,j))

#   [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
# j "a"  "a"  "a"  "b"  "b"  "c"  "a"  "b"  "c"  "d"  
# j "b"  "c"  "d"  "c"  "d"  "d"  "a"  "b"  "c"  "d"  

答案 1 :(得分:1)

您可以重新整形数据以避免此

library(psych)
library(reshape2)

# example data
dat <- mtcars[1:4]

# For all correlations
melt(corr.test(dat)$r)

# For unique correlations
out <- corr.test(dat)$r
out[upper.tri(out)] <- NA    

melt(out, na.rm=TRUE)

   Var1 Var2      value
#  1   mpg  mpg  1.0000000
#  2   cyl  mpg -0.8521620
#  3  disp  mpg -0.8475514
#  4    hp  mpg -0.7761684
#  6   cyl  cyl  1.0000000
#  7  disp  cyl  0.9020329
#  8    hp  cyl  0.8324475
#  11 disp disp  1.0000000
#  12   hp disp  0.7909486
#  16   hp   hp  1.0000000

答案 2 :(得分:0)

您可以做的一件事是将答案放在一个数组中,使用Var1作为键,将Var2作为值,然后将这些对添加到临时数组中,如果临时数组中尚不存在该对。

答案 3 :(得分:0)

感谢您的回答。

我最后拍了一张照片,这就是我想出的:

j<-c("a","b","c","d")  
l<-expand.grid(j,j)


twist<-function(l){
l<-subset(l,l[,1]!=l[,2])
leng<-length(l[,1])/2
for (i in 1:leng) {
    g1<-l[,1]
    g2<-l[,2]
    g1[i]<-l[i,2]
    g2[i]<-l[i,1]
    l[,1]<-g1
    l[,2]<-g2
l<-unique(l[c("Var1", "Var2")])

}
return(l)
}
k<-twist(l)

print(k)

   Var1 Var2
2     a    b
3     a    c
4     a    d
7     b    c
8     b    d
12    c    d

我打电话给'扭曲&#39;原因很明显。随意批评它。