将个体列表转换为R中对的出现

Lad*_*aďo 3 r dataframe

我需要特定格式的data.frame进行社会结构分析.如何转换包含多个事件上一起出现的个人列表的data.frame:

my.df <- data.frame(individual = c("A","B","C","B","C","D"),
                    time = rep(c("event_01","event_02"), each = 3))

  individual     time
1          A event_01
2          B event_01
3          C event_01
4          B event_02
5          C event_02
6          D event_02
Run Code Online (Sandbox Code Playgroud)

包含每对(包括[A,A]; [B,B]等对的出现的data.frame:

ind_1    ind_2   times
  A        A       0
  A        B       1
  A        C       1
  A        D       0
  B        A       1
  B        B       0
  B        C       2
  B        D       1
  C        A       1
  C        B       2
  C        C       0
  C        D       1
  D        A       0
  D        B       1
  D        C       1
  D        D       0
Run Code Online (Sandbox Code Playgroud)

A5C*_*2T1 8

在基数R中,您可以执行以下操作:

data.frame(as.table(`diag<-`(tcrossprod(table(my.df)), 0)))
#    individual individual.1 Freq
# 1           A            A    0
# 2           B            A    1
# 3           C            A    1
# 4           D            A    0
# 5           A            B    1
# 6           B            B    0
# 7           C            B    2
# 8           D            B    1
# 9           A            C    1
# 10          B            C    2
# 11          C            C    0
# 12          D            C    1
# 13          A            D    0
# 14          B            D    1
# 15          C            D    1
# 16          D            D    0
Run Code Online (Sandbox Code Playgroud)

tcrossprod 为您提供以下内容:

> tcrossprod(table(my.df))
          individual
individual A B C D
         A 1 1 1 0
         B 1 2 2 1
         C 1 2 2 1
         D 0 1 1 1
Run Code Online (Sandbox Code Playgroud)

这基本上是您正在寻找的所有信息,但您希望它以稍微不同的形式,没有对角线值.

我们可以将对角线设置为零:

`diag<-`(theOutputFromAbove, 0)
Run Code Online (Sandbox Code Playgroud)

然后,为了得到长形式,让R认为结果matrixtable通过使用as.table,并使用s 的data.frame方法table.