R-按列应用函数

R-按列应用函数,r,sapply,R,Sapply,假设我有一个排序向量x和一个矩阵,其中两列包含0/1 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] [

假设我有一个排序向量x和一个矩阵,其中两列包含0/1

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值执行一次计算,这是下一个>=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

对每个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,边距=2(跨列)

find_idx=x[n]+3[1]
}
转换=函数(x){
y=x
用于(1中的i:长度(x)){
如果(x[i]==1){
y[i]=find_idx(i)
}
}
返回(y)
}
应用(m01、2、转换)
[,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
与另一个答案(+1)一样,您可以使用apply,边距=2(跨列)

find_idx=x[n]+3[1]
}
转换=函数(x){
y=x
用于(1中的i:长度(x)){
如果(x[i]==1){
y[i]=find_idx(i)
}
}
返回(y)
}
应用(m01、2、转换)
[,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

这很有帮助,非常感谢!这很有帮助,非常感谢!这很有帮助,非常感谢!这很有帮助,非常感谢!