R - 按列应用函数

R - apply function columnwise

假设我有一个排序向量 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 行取值 1 的列(因为 x[3] - x[1] > 3 ) 和第 8 行。我希望第 2 列也一样。

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

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

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

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

您对每个 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

与另一个答案 (+1) 一样,您将使用 apply with MARGIN=2(跨列)。

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