我的向量看起来像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]})
有没有更简单的选择可以实现我想要的?
答案 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