R-按列应用函数
假设我有一个排序向量x和一个矩阵,其中两列包含0/1R-按列应用函数,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 <- 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
这很有帮助,非常感谢!这很有帮助,非常感谢!这很有帮助,非常感谢!这很有帮助,非常感谢!