使用 from 和 to 字段将链拆分为 data.frame

Splitting chain into data.frame with from and to fields

我有看起来像 var a %->% var b %->% var c %->% var a 的向量。 %->% 表示圆弧。我想将这些向量拆分为 data.frames 形式:

   from    to
1 var a var b
2 var b var c
3 var c var a

我发现了两个看起来都过于复杂的版本。

版本 1:带有 for 循环。做我想要的但相当复杂

v <- "var a %->% var b %->% var c %->% var a"
v <- trimws(unlist(strsplit(v, "%->%")))
links <- data.frame(from = character(length(v) - 1), to = character(length(v) - 1), stringsAsFactors = FALSE)
for(i in 1:length(v) - 1) {
  links$from[i] <- v[i]
  links$to[i] <- v[i + 1]
}

Verison 2:我找到了一个使用 sapply 的解决方案,它删除了 for-loop 但是我认为 <<- 有点危险:

sapply(1:(length(v) - 1), function(i) {links$from[i] <<- v[i]; links$to[i] <<- v[i + 1]})

有没有更简单的选择来实现我想要的?

您可以一次分配所有列:

v <- "var a %->% var b %->% var c %->% var a"
v <- trimws(unlist(strsplit(v, "%->%")))

data.frame(from = head(v, -1), to = tail(v, -1))
#    from    to
# 1 var a var b
# 2 var b var c
# 3 var c var a

head(v, -1) 是写 v[-length(v)] 的好方法(v 的最后一个元素除外),tail(v, -1) 是写 [=16 的并行方式=](除 v 的第一个元素外的所有元素)。如果您觉得更清楚,可以使用 [ 版本:

data.frame(from = v[-length(v)], to = v[-1])
# same result