将个体列表转换为R

时间:2015-05-11 08:51:40

标签: 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

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

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

3 个答案:

答案 0 :(得分: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

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

这基本上是您要查找的所有信息,但您希望它的形式略有不同,没有对角线值。

我们可以使用以下方法将对角线设置为零

`diag<-`(theOutputFromAbove, 0)

然后,要获得长格式,请使用matrix欺骗R认为生成的tableas.table,并使用data.frame方法table秒。

答案 1 :(得分:4)

你可以这样做:

创建新data.frame的前2个变量:

df2$times[df2[, 1]==df2[, 2]] <- 0

将相同个体对的值设为0:

comb_diff <- combn(levels(my.df$individual), 2)

查看其他独特组合:

times_uni <- apply(comb_diff, 2, function(inds){
                                     sum(table(my.df$time[my.df$individual %in% inds])==2)
                                 })

计算一起找到每个唯一组合的时间:

df2$times[match(c(paste0(comb_diff[1,], comb_diff[2,]), paste0(comb_diff[2, ], comb_diff[1, ])), paste0(df2[, 1],df2[, 2]))] <- rep(times_uni, 2)

df2
#   ind_1 ind_2 times
#1      A     A     0
#2      A     B     1
#3      A     C     1
#4      A     D     0
#5      B     A     1
#6      B     B     0
#7      B     C     2
#8      B     D     1
#9      C     A     1
#10     C     B     2
#11     C     C     0
#12     C     D     1
#13     D     A     0
#14     D     B     1
#15     D     C     1
#16     D     D     0

最后,填写新的data.frame:

INSERT INTO [dbo].[TableOnlyPK]
DEFAULT VALUES

答案 2 :(得分:0)

您可以使用data.table

来完成
Solution Properties > Build > Optimized Code