我的网络数据包含两列,第一列是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"
答案 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)