2016-10-28 14 views
2

2つの列、最初はsender識別子、vectorの長さは1、2番目の列はa receiver識別子で、長さが1以上のvectorです。これは難しい部分ですが、それぞれsenderは1つ以上のreceiverと接続できます。ベクトルの識別子とベクトルのリスト(ベクトルの)との間の接続ごとにdata.frameを作成します。R

senderreceiverの2つの列を持つdata.frameを作成しようとしていますが、各ペアごとに接続しています。ここで

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) 
関連する問題