为向量中的标识符和R中的列表(向量)之间的每个连接创建data.frame

时间:2016-10-28 19:55:34

标签: r

我的网络数据包含两列,第一列是sender标识符,vector长度为1,第二列是receiver标识符,是vector长度1或更长。这是一个棘手的部分,每个sender可以与一个或多个receiver建立联系。

我正在尝试创建一个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"

1 个答案:

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