在R中匹配和记录

Dem*_*emo 1 r matching

我有这样的数据框,称为df:

a  b  c  d  e  f  
b  c  f  a  a  a  
d  f  a  b  c  c  
f  e  d  f  f  d  
Run Code Online (Sandbox Code Playgroud)

第一行实际上是列名.让我们举个例子来解释这里的含义是:df[1,1]b的,这意味着存在从关系ab,所以在列中的值意味着从"列名",以该条目关系.
我想创建一个matrix(df1)6*6维,列和行名都是列名df.如果从"i"到"j"之间存在关系,则(i,j)条目为1,否则为0.

我想要的输出是:

    a  b  c  d  e  f
a   0  1  0  1  0  1
b   0  0  1  0  1  1
c   1  0  0  1  0  1
d   1  1  0  0  0  1
e   1  0  1  0  0  1
f   1  0  1  1  0  0
Run Code Online (Sandbox Code Playgroud)

如何在R中使用循环?
没有循环如何做到这一点,只使用基本的R?
如何使用R中的一些精美包装?

jaz*_*rro 5

使用reshape2包,这是一种方法.我的示例数据将所有列都作为字符.您可以使用melt()长格式重塑数据.然后,您使用dcast()相同的包.

library(magrittr)
library(reshape2)

melt(mydf, measure.vars = names(mydf)) %>%
dcast(variable ~ value, length)

  variable a b c d e f
1        a 0 1 0 1 0 1
2        b 0 0 1 0 1 1
3        c 1 0 0 1 0 1
4        d 1 1 0 0 0 1
5        e 1 0 1 0 0 1
6        f 1 0 1 1 0 0
Run Code Online (Sandbox Code Playgroud)

编辑 如下面akrun所述,您可以recast()在reshape2包中完成所有工作.

recast(mydf, measure.var= names(mydf),variable~value, length)
Run Code Online (Sandbox Code Playgroud)

数据

mydf <- structure(list(a = c("b", "d", "f"), b = c("c", "f", "e"), c = c("f", 
"a", "d"), d = c("a", "b", "f"), e = c("a", "c", "f"), f = c("a", 
"c", "d")), .Names = c("a", "b", "c", "d", "e", "f"), class = "data.frame", row.names = c(NA, 
-3L))
Run Code Online (Sandbox Code Playgroud)