【问题标题】:Splitting chain into data.frame with from and to fields使用 from 和 to 字段将链拆分为 data.frame
【发布时间】:2019-04-04 13:19:42
【问题描述】:

我的向量看起来像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,但我认为 &lt;&lt;- 有点危险:

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

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

【问题讨论】:

    标签: r string strsplit


    【解决方案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) 是写v[-1] 的并行方式(除了v 的第一个元素) )。如果您觉得[ 版本对您来说更清晰,您可以使用它们:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-22
      • 2016-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-29
      • 1970-01-01
      • 2020-07-26
      相关资源
      最近更新 更多