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

时间:2019-04-04 13:19:42

标签: r string strsplit

我的向量看起来像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]
}

版本2:我发现使用sapply的解决方案删除了​​for-loop,但我认为<<-有点危险:

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

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

1 个答案:

答案 0 :(得分:3)

您可以一次分配整列:

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)是编写v[-1]的并行方法(除了v的第一个元素以外的所有元素)。如果您觉得更清晰,可以使用[版本:

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