【问题标题】:how to select neighbouring elements in a vector and put them into a list or matrix in R如何选择向量中的相邻元素并将它们放入R中的列表或矩阵中
【发布时间】:2020-03-24 04:44:24
【问题描述】:

我有一个关于如何选择向量中的相邻元素并将它们放入 R 中的列表或矩阵的问题。 例如:

vl <- c(1,2,3,4,5)

我想得到这样的结果:

1,2
2,3
3,4
4,5

结果可以是列表或矩阵

我知道我们可以使用循环来获取结果。像这样:

pl <- list()
k=0
for (p in 1: length(vl)) {
          k=k+1
          pl[[k]] <- sort(c(vl[p],vl[p+1]))}

但我有一个大数据。使用循环相对较慢。 有没有直接获取结果的功能? 非常感谢!

【问题讨论】:

    标签: r


    【解决方案1】:

    我们可以使用headtail 分别忽略最后一个和第一个元素。

    data.frame(a = head(vl, -1), b = tail(vl, -1))
    
    #  a b
    #1 1 2
    #2 2 3
    #3 3 4
    #4 4 5
    

    编辑

    如果需要对数据进行排序,我们可以使用apply row-wise 对其进行排序。

    vl <- c(2,5,3,1,6,4)
    t(apply(data.frame(a = head(vl, -1), b = tail(vl, -1)), 1, sort))
    
    
    #     [,1] [,2]
    #[1,]    2    5
    #[2,]    3    5
    #[3,]    1    3
    #[4,]    1    6
    #[5,]    4    6
    

    【讨论】:

    • 非常感谢您的回答!但是,我忘了说每一行中的元素都应该排序。对不起,这个例子不是很清楚。另一个例子是:vl
    • @Freeego 我们可以使用apply 对它进行逐行排序。更新了答案。
    【解决方案2】:

    你可以这样做:

    matrix(c(vl[-length(vl)], vl[-1]), ncol = 2)
    
         [,1] [,2]
    [1,]    1    2
    [2,]    2    3
    [3,]    3    4
    [4,]    4    5
    

    如果要按行对两列进行排序,则可以使用pmin()pmax(),这将比使用大量行的apply(x, 1, sort) 更快。

    sapply(c(pmin, pmax), do.call, data.frame(vl[-length(vl)], vl[-1]))
    

    【讨论】:

    • 同样的方法,但更直接一点:cbind(vl[-length(vl)], vl[-1])
    • 非常感谢您的回答! “cbind”是非常好的方法。但是,我忘了说每一行中的元素都应该排序。对不起,这个例子不是很清楚。另一个例子是:vl
    • @Freeego 事后排序。
    • 抱歉回复晚了!非常感谢!方法很好!
    【解决方案3】:

    这个问题也可以通过在长度为 2 的滚动窗口上应用sort() 函数来解决:

    vl <- c(2,5,3,1,6,4)
    zoo::rollapply(vl, 2L, sort)
    

    根据要求返回一个矩阵:

         [,1] [,2]
    [1,]    2    5
    [2,]    3    5
    [3,]    1    3
    [4,]    1    6
    [5,]    4    6
    

    注意 modified 输入向量 vl 已被 OP 发布在 cmets herehere 中。

    除了zoo,还有其他提供rollapply功能的包,例如,

    t(rowr::rollApply(vl, sort, 2L, 2L))
    

    【讨论】:

      猜你喜欢
      • 2021-05-22
      • 2021-03-08
      • 2014-04-16
      • 2014-12-31
      • 2015-05-20
      • 2012-10-28
      • 1970-01-01
      • 1970-01-01
      • 2021-11-28
      相关资源
      最近更新 更多