【问题标题】:R - apply function columnwiseR - 按列应用函数
【发布时间】:2021-03-06 11:38:54
【问题描述】:

假设我有一个已排序的向量 x 和一个包含 0/1 的 2 列的矩阵。

x <- c(5,7,9,11,15,19,22,25,28,33,36,38,45,47,49,51,53,59)
[1]  5  7  9 11 15 19 22 25 28 33 36 38 45 47 49 51 53 59

m01 <- cbind(c(1,numeric(5),1,numeric(11)), c(numeric(3),1,numeric(5),1,numeric(8)) )

      [,1] [,2]
 [1,]    1    0
 [2,]    0    0
 [3,]    0    0
 [4,]    0    1
 [5,]    0    0
 [6,]    0    0
 [7,]    1    0
 [8,]    0    0
 [9,]    0    0
[10,]    0    1
[11,]    0    0
[12,]    0    0
[13,]    0    0
[14,]    0    0
[15,]    0    0
[16,]    0    0
[17,]    0    0
[18,]    0    0

两列都表示向量 x 中的特定索引位置。当有1时,我想在x中找到第一次差为3的索引位置。

因此,由于m01 的第 1 列中的第一行和第 7 行是 1 和 x[1] = 5, x[7] = 22,我想在第 3 行(自 x[3] - x[1] &gt; 3)和第 8 行获得一个取值为 1 的列。我想要与第 2 列相同。

到目前为止,我已经编写了一个函数,可以让我识别特定列的这些索引位置,但我现在不知道如何将其应用于这两个列。

find_idx <- function(n){
  which(x > x[n] + 3)[1]
}

sapply(which(m01[,1] == 1), FUN = find_idx)

有人知道怎么做吗? 非常感谢!

【问题讨论】:

    标签: r sapply


    【解决方案1】:

    您执行一次计算,对于每个 x 值,即 >=3 的下一个条目,可能有更快的方法来执行此操作,但由于您的 x 向量很小,让我们这样做:

    idx = sapply(x,function(i)(which(x-i>=3)[1]))
    
    idx
    
    [1]  3  4  5  5  6  7  8  9 10 11 13 13 15 16 17 18 18 NA
    

    例如,第一个 1 条目将 3 条目作为值 >=3。然后你只需要从你的另一个矩阵中调用这些值:

    apply(m01,2,function(i)idx[i>0])
    
        [,1] [,2]
    [1,]    3    5
    [2,]    8   11
    

    【讨论】:

      【解决方案2】:

      与其他答案 (+1) 一样,您可以使用 MARGIN=2 的 apply(跨列)。

      find_idx <- function(n){
        which(x >= x[n] + 3)[1]
      }
      convert=function(x) {
        y=x
        for (i in 1:length(x)) {
          if (x[i]==1) {
            y[i]=find_idx(i)
          }
        }
        return(y)
      }
      apply(m01, 2, convert)
      
            [,1] [,2]
       [1,]    3    0
       [2,]    0    0
       [3,]    0    0
       [4,]    0    5
       [5,]    0    0
       [6,]    0    0
       [7,]    8    0
       [8,]    0    0
       [9,]    0    0
      [10,]    0   11
      [11,]    0    0
      [12,]    0    0
      [13,]    0    0
      [14,]    0    0
      [15,]    0    0
      [16,]    0    0
      [17,]    0    0
      [18,]    0    0
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-06-24
        • 2016-10-07
        • 2023-03-31
        • 2014-03-17
        • 2021-07-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多