使用 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
我有看起来像 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