Я хочу создать data.frame
ребер.Проблемы возникают, когда множество ребер заканчиваются на одном узле.Края определены в векторах from
и to
.
# Data
vertices <- data.frame(id = 1:3, label = c("a", "b", "c"), stringsAsFactors = FALSE)
to <- c("a", "b", "c")
from1 <- c("c", "a", "b")
from2 <- c("c", "a", "a,b,c")
Что я пробовал:
# Attempt 1
create_edges_1 <- function(from, to) {
to <- sapply(to, function(x){vertices$id[vertices$label == x]})
from <- sapply(from, function(x){vertices$id[vertices$label == x]})
data.frame(from = from, to = to, stringsAsFactors = FALSE)
}
Это работает, например, create_edges_1(from1, to)
, вывод:
from to
c 3 1
a 1 2
b 2 3
Однако, например, from2
эта попытка не удалась.
Поэтому я попробовал следующее:
# Attempt 2
create_edges_2 <- function(from, to) {
to <- sapply(unlist(sapply(strsplit(to, ","), function(x){vertices$id[vertices$label == x]})), function(x){rep(x, sapply(strsplit(from2, ","), length))})
from <- unlist(sapply(strsplit(from2, ","), function(x){vertices$id[vertices$label == x]}))
data.frame(from = from, to = to, stringsAsFactors = FALSE)
}
Идея заключалась в том, чтобы "растянуть" to
для каждого узлагде более одного края заканчивается.Однако create_edges_2(from1, to)
и create_edges_2(from2, to)
оба выдают ошибку
Ошибка в rep (x, sapply (strsplit (from2, ","), length)): недопустимый аргумент "times"
Что я делаю неправильно в моих sapply
выражениях?
Ожидаемый результат для create_edges_2(from2, to)
:
from to
3 1
1 2
1 3
2 3
3 3