Это однострочный подход, который не требует dplyr
:
vertices[, 'occurrences'] <- apply(vertices, 1, function(V)
paste(which(apply(edges, 1, function (E, V)
isTRUE(all.equal(V, E[1:2], check.attributes=FALSE)) ||
isTRUE(all.equal(V, E[3:4], check.attributes=FALSE)), V=V)),
collapse=',')
)
Код принимает каждую строку vertices
по очереди, затем проверяет совпадение в каждой строке edges
, проверяя каждый конец строки по очереди. isTRUE
необходимо разбить результаты сравнения на простое «соответствует или нет»; which
преобразует строку TRUE
s и FALSE
s в целые числа, соответствующие строкам, а paste
преобразует эту серию целых чисел в символьную строку, разделенную запятыми.
Пример данных
vertices<- structure(list(
x = c(2.464286, 0.7, 3.5, 2.25, 2.583333, 4.3),
y = c(2.464286, 3.7875, 3.5, 4.75, 1.75, 3.9)),
class = "data.frame",
row.names = c("1", "2", "3", "4", "5", "6")
)
edges <- structure(list(
x0 = c(2.464286, 0.7, 2.464286, 3.5, 2.25),
y0 = c(2.464286, 3.7875, 2.464286, 3.5, 4.75),
x1 = c(2.583333, 2.464286, 3.5, 4.3, 3.5),
y1 = c(1.75, 2.464286, 3.5, 3.9, 3.5)),
class = "data.frame",
row.names = c("1", "2", "3", "4", "5")
)
Выход:
> vertices
x y occurrences
1 2.464286 2.464286 1,2,3
2 0.700000 3.787500 2
3 3.500000 3.500000 3,4,5
4 2.250000 4.750000 5
5 2.583333 1.750000 1
6 4.300000 3.900000 4