【问题标题】:Vectorizing rep and seq in R在 R 中向量化 rep 和 seq
【发布时间】:2011-02-20 23:26:24
【问题描述】:

我正在尝试完成两件事。首先,如果我有一个向量1:5,我想得到一个矩阵(或两个向量),指示这些元素的唯一组合,包括两倍相同的数字,但不包括重复。

现在我可以使用矩阵来做到这一点:

foo <- matrix(1:5,5,5)
cbind(foo[upper.tri(foo,diag=TRUE)],foo[lower.tri(foo,diag=TRUE)])
      [,1] [,2]
 [1,]    1    1
 [2,]    1    2
 [3,]    2    3
 [4,]    1    4
 [5,]    2    5
 [6,]    3    2
 [7,]    1    3
 [8,]    2    4
 [9,]    3    5
[10,]    4    3
[11,]    1    4
[12,]    2    5
[13,]    3    4
[14,]    4    5
[15,]    5    5

但必须有一个更简单的方法。我尝试在seq 上使用Vectorize,但这给了我一个错误:

cbind(Vectorize(seq,"from")(1:5,5),Vectorize(seq,"to")(5,1:5))
    Error in Vectorize(seq, "from") : 
      must specify formal argument names to vectorize

我想做的第二件事是,如果我有一个包含向量的列表bar,以获取一个向量,该向量包含列表中重复的元素等于该元素中元素的数量。我可以这样做:

unlist(apply(rbind(1:length(bar),sapply(bar,length)),2,function(x)rep(x[1],x[2])))
 [1] 1 1 1 1 1 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3

但同样必须有一个更简单的方法。我在这里再次尝试了Vectorize,但出现了同样的错误:

Vectorize(rep,"each")(1:length(bar),each=sapply(bar,length))
 in Vectorize(rep, "each") : 
  must specify formal argument names to vectorize

【问题讨论】:

    标签: r seq vectorization


    【解决方案1】:

    关于你的第一个问题:base 中的简单 combn() 函数怎么样:

    > combn(1:5,2)
         [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
    [1,]    1    1    1    1    2    2    2    3    3     4
    [2,]    2    3    4    5    3    4    5    4    5     5
    

    如果你需要一个矩阵来排列你组成的矩阵,只需用t()转置它,比如t(combn(1:5,2))

    注意:这不会返回序列中重复元素的组合,但你可以轻松地将它们添加到矩阵中。

    【讨论】:

    • 接受这个答案,因为它是我一直在寻找的,即使我自己也不知道:) 我现在看到问题中的示例是错误的。谢谢
    【解决方案2】:
    > unlist(lapply(1:5, seq, from=1))
     [1] 1 1 2 1 2 3 1 2 3 4 1 2 3 4 5
    > unlist(lapply(1:5, seq, 5))
     [1] 1 2 3 4 5 2 3 4 5 3 4 5 4 5 5
    

    > bar = lapply(1:5, seq, from=1)
    > rep(seq_along(bar), sapply(bar, length))
     [1] 1 2 2 3 3 3 4 4 4 4 5 5 5 5 5
    

    【讨论】:

      【解决方案3】:

      Martin Morgan 对第一部分的解决方案的更快变体:

      rep(1:5,5:1)
       [1] 1 1 1 1 1 2 2 2 2 3 3 3 4 4 5
      unlist(lapply(1:5,function(x) x:5))
       [1] 1 2 3 4 5 2 3 4 5 3 4 5 4 5 5
      

      分别快大约 7 倍和 3 倍。

      我不确定我是否遵循您在第二部分中的意思,但以下内容似乎符合您的描述:

      lapply(bar,function(x) rep(x,length(x)))
      

      【讨论】:

        猜你喜欢
        • 2018-02-20
        • 1970-01-01
        • 2021-05-12
        • 1970-01-01
        • 1970-01-01
        • 2021-12-11
        • 1970-01-01
        • 2013-04-01
        • 1970-01-01
        相关资源
        最近更新 更多