2016-10-28 68 views
2

我有網絡數據由兩列組成,第一個是sender標識符,vector長度爲1,第二個receiver標識符,它是長度爲1或更多的vector。這是棘手的部分,想法是每個sender可以連接一個或多個receiver爲矢量中的標識符和(矢量)列表之間的每個連接創建數據幀R

我試圖創建一個data.frame兩列,一個用於sender和一個用於receiver,每個成對連接。下面是最終的數據應該是什麼樣的目標:

output <- 
    data.frame(sender = c("person_1", c("person_2", "person_2"), "person_3", c("person_4", "person_4"), "person_5"), 
       receiver = c("person_6", c("person_7", "person_8"), "person_9", c("person_10", "person_11"), "person_12")) 

> output 
    sender receiver 
1 person_1 person_6 
2 person_2 person_7 
3 person_2 person_8 
4 person_3 person_9 
5 person_4 person_10 
6 person_4 person_11 
7 person_5 person_12 

這裏是數據:

sender <- paste("person_", 1:5, sep = "") 
receiver <- list("person_6", c("person_7", "person_8"), "person_9", c("person_10", "person_11"), "person_12") 

> str(sender) 
chr [1:5] "person_1" "person_2" "person_3" "person_4" "person_5" 

> str(receiver) 
List of 5 
$ : chr "person_6" 
$ : chr [1:2] "person_7" "person_8" 
$ : chr "person_9" 
$ : chr [1:2] "person_10" "person_11" 
$ : chr "person_12" 

回答

2

一種方式是發送者的名字在接收器列表中添加相關項,然後使用這對奇特命名功能stack

res0 = stack(setNames(receiver, sender))[, 2:1] 

在結果的名稱是怪異的,所以你可能要改變他們

res = setNames(res0, c("sender", "receiver")) 

    sender receiver 
1 person_1 person_6 
2 person_2 person_7 
3 person_2 person_8 
4 person_3 person_9 
5 person_4 person_10 
6 person_4 person_11 
7 person_5 person_12 

這與OP的output對象與列類不同。


我可能會使用magrittr的可讀性這裏,而不是上面的代碼:

library(magrittr) 
receiver %>% setNames(sender) %>% stack %>% rev %>% setNames(c("sender", "receiver")) 

或者(和我不想推薦這...):

library(tidyr) 
library(tibble) 
data_frame(sender, receiver) %>% unnest(receiver)