【问题标题】:Sequentially remove vector elements依次删除向量元素
【发布时间】:2018-01-27 17:58:01
【问题描述】:

我想复制一个向量,但该向量中的一个值缺失(顺序)。

比如我的向量是

value <- 1:7

首先,系列没有 1,其次没有 2,依此类推。最后,该系列在一个向量中。

预期的输出看起来像

2 3 4 5 6 7 1 3 4 5 6 7 1 2 4 5 6 7 1 2 3 5 6 7 1 2 3 4 6 7 1 2 3 4 5 6

有什么聪明的方法可以做到这一点吗?

【问题讨论】:

    标签: r vector seq


    【解决方案1】:

    您可以使用对角矩阵来设置一个逻辑向量,使用它来删除适当的值。

    n <- 7
    
    rep(1:n, n)[!diag(n)]
    #  [1] 2 3 4 5 6 7 1 3 4 5 6 7 1 2 4 5 6 7 1 2 3 5 6 7 1 2 3 4 6 7 1 2 3 4 5
    # [36] 7 1 2 3 4 5 6
    

    【讨论】:

      【解决方案2】:

      好吧,您当然可以将其作为单线器来做,但我不确定它是否称得上聪明。例如:

      x <- 1:7
      do.call("c", lapply(as.list(-1:-length(x)), function(a)x[a]))
      

      这个简单的使用lapply 创建x 的副本列表,并删除其中的每个条目,然后使用c 连接它们。 do.call 函数将其第一个参数(一个函数)应用于其第二个参数(函数的参数列表)。

      【讨论】:

        【解决方案3】:

        为了好玩,也可以只使用rep

        > n <- 7
        > rep(1:n, n)[rep(c(FALSE, rep(TRUE, n)), length.out=n^2)]
        [1] 2 3 4 5 6 7 1 3 4 5 6 7 1 2 4 5 6 7 1 2 3 5 6 7 1 2 3 4 6 7 1 2 3 4 5 7 1 2
        [39] 3 4 5 6
        

        但我认为lapply 更干净。

        【讨论】:

          【解决方案4】:

          你也可以这样做:

          n <- 7
          rep(seq(n), n)[-seq(1,n*n,n+1)]
          
          #[1] 2 3 4 5 6 7 1 3 4 5 6 7 1 2 4 5 6 7 1 2 3 5 6 7 1 2 3 4 6 7 1 2 3 4 5 7 1 2 3 4 5 6
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-05-05
            • 1970-01-01
            • 2021-07-03
            相关资源
            最近更新 更多