2017-07-07 41 views
0

我有一个data.frame两列。一个指示对象,另一个指示对象是否在某个组内。如何在不编写循环的情况下创建一个邻接矩阵?基于二元变量创建邻接矩阵

data("mtcars") 
testdf <- data.frame(names=as.character(row.names(mtcars)[1:5]), 
       ingroup=0) 

set.seed(123) 
testdf$ingroup[testdf$names%in%row.names(mtcars)[sample(length(row.names(mtcars)[1:5]), 2)]] <- 1 

testdf 
       names ingroup 
1   Mazda RX4  0 
2  Mazda RX4 Wag  1 
3  Datsun 710  0 
4 Hornet 4 Drive  1 
5 Hornet Sportabout  0 

EDIT:所需的输出应该是一个矩阵指示是否对象是某组内:

data.frame(x1=c(0,0,0,0,0), 
     x2=c(0,1,0,0,1), 
     x3=c(0,0,0,0,0), 
     x4=c(0,0,0,0,0), 
     x5=c(0,1,0,0,1)) 
colnames(output) <- c("Datsun 710", "Hornet 4 Drive", "Hornet Sportabout", "Mazda RX4","Mazda RX4 Wag") 
rownames(output) <- c("Datsun 710", "Hornet 4 Drive", "Hornet Sportabout", "Mazda RX4","Mazda RX4 Wag") 

output 
        Datsun 710 Hornet 4 Drive Hornet Sportabout Mazda RX4 Mazda RX4 Wag 
Datsun 710     0    0     0   0    0 
Hornet 4 Drive    0    1     0   0    1 
Hornet Sportabout   0    0     0   0    0 
Mazda RX4     0    0     0   0    0 
Mazda RX4 Wag    0    1     0   0    1 

谢谢, 托马斯

+0

不知道为什么你说我的解决方案没有提供预期的输出。根据你的例子和预期输出,它给出了相同的 – akrun

+0

不,我犯了同样的错误,我打算避免。抱歉。正如你在'testdf'中看到的那样,Datsun 710不应该得到'1'。通过使用'tcrossprod(tbl)',我们得到了与我想要的完全相反的结果(因为如果零点击,它会得到一个)。通过使用'tcrossprod(tbl [,2])'我得到我想要的。对?对困惑感到抱歉。 – Thomas

回答

0

你只取的叉积ingroup变量:

res <- tcrossprod(testdf$ingroup) 
rownames(res) <- testdf$names 
colnames(res) <- testdf$names 
res 

# Mazda RX4 Mazda RX4 Wag Datsun 710 Hornet 4 Drive Hornet Sportabout 
# Mazda RX4     0    0   0    0     0 
# Mazda RX4 Wag    0    1   0    1     0 
# Datsun 710    0    0   0    0     0 
# Hornet 4 Drive   0    1   0    1     0 
# Hornet Sportabout   0    0   0    0     0