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
假设我有一个排序向量 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