2015-05-11 23 views
3

我需要用於社會結構分析的特定格式的data.frame。如何個體對多個事件一起存在的的data.frame含列表轉換:將個人列表轉換爲R中的成對對象

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 

成每個對含occurence 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 
+0

你有你的真實數據只有兩種類型的事件? –

+0

Hi @ColonelBeauvel。不,我有更多的二十個事件。 –

回答

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) 

然後,爲了獲得長期的形式,誘騙R導入思維所產生的matrixtable使用as.table,並利用data.frame方法爲table s。

0

則可以使用data.table

dt_combs <- my.dt[, 
        list(ind_1 = combn(individual, 2)[1, ], 
         ind_2 = combn(individual, 2)[2, ]), 
        by = time] 
dt_ncombs <- dt_combs[, .N, by = c("ind_1", "ind_2")] 
dt_ncombs_inverted <- copy(dt_ncombs) 
dt_ncombs_inverted[, temp := ind_1] 
dt_ncombs_inverted[, ind_1 := ind_2] 
dt_ncombs_inverted[, ind_2 := temp] 
dt_ncombs_inverted[, temp := NULL] 
dt_ncombs <- rbind(dt_ncombs, dt_ncombs_inverted) 
dt_allcombs <- data.table(expand.grid(
    ind_1 = my.dt[, unique(individual)], 
    ind_2 = my.dt[, unique(individual)] 
)) 
dt_final <- merge(dt_allcombs, 
        dt_ncombs, 
        all.x = TRUE, 
        by = c("ind_1", "ind_2")) 
dt_final[is.na(N), N := 0] 
dt_final 
+0

嗨@MichelleUsuilli !.感謝您的迴應,但是您的最終輸出與我的輸出不匹配。請比較它們。 –

+0

是的。我只是添加了一個額外的步驟,現在它應該可以工作。 –

4

你可以這樣做:

創建新data.frame的第2個變量:

df2 <- expand.grid(ind_2=levels(my.df$individual), ind_1=levels(my.df$individual))[, 2:1] 

把值設爲0的相同的對個人的:

df2$times[df2[, 1]==df2[, 2]] <- 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) 
           }) 

最後填充新data.frame:

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 
相關問題