我有两个向量
x <- rnorm(100)
y <- rnorm(100)
我需要计算所有点之间的斜率(公式:y2-y1 / x2-x1)。所以我需要点(x1, y1)
和(x1, y2)
,(x1, y1)
和(x1, y3)
...,(x2,y2)和(y2,y3)等之间的斜率。总计将是choose(n, 2)
坡度。
如何有效地在R中做到这一点(我需要运行多次,所以效率在这里真的很重要)
答案 0 :(得分:4)
如果您需要choose(n, 2)
个n
点之间的(x, y)
坡度,请使用
xy <- cbind(x, y)
library(RcppAlgos)
ind <- comboGeneral(nrow(xy), 2)
d <- xy[ind[, 2], ] - xy[ind[, 1], ]
slope <- d[, 2] / d[, 1]
我没有使用R core的combn
函数。有关案例研究,请参见Product between all combinations of a vector's elements。
答案 1 :(得分:1)
使用末尾注释中的数据,并假设n选择2个斜率。
slopes <- c(combn(y, 2, diff) / combn(x, 2, diff))
slopes
## [1] -3.7970202 -1.4062612 -3.8066222 -3.1325626 -0.9648338 -3.8171698
## [7] -2.5220191 -0.3885287 -0.5732387 4.1033272
分别是这些对的斜率:
nms <- combn(n, 2, paste, collapse = ":")
nms
## [1] "1:2" "1:3" "1:4" "1:5" "2:3" "2:4" "2:5" "3:4" "3:5" "4:5"
all.equal(slopes, slopes2[order(nms2)])
如果那还不够快,请尝试从gRBase(位于Bioconductor中)尝试combnPrim
:
library(gRBase)
xx <- combnPrim(x, 2)
yy <- combnPrim(y, 2)
slopes2 <- (yy[2, ] - yy[1, ]) / (xx[2, ] - xx[1, ])
slopes2
## [1] -3.7970202 -1.4062612 -0.9648338 -3.8066222 -3.8171698 -0.3885287
## [7] -3.1325626 -2.5220191 -0.5732387 4.1033272
nms2 <- apply(combnPrim(n, 2), 2, paste, collapse = ":")
## [1] "1:2" "1:3" "2:3" "1:4" "2:4" "3:4" "1:5" "2:5" "3:5" "4:5"
all.equal(slopes, slopes2[order(nms2)])
## [1] TRUE
我们使用以下输入:
set.seed(123)
n <- 5
x <- rnorm(n)
y <- rnorm(n)