如果这个问题构造不当,我对R很新,请提前道歉。基本上我有一个分段函数,我需要计算大量行的值。我当前的功能看起来像这样:
f <- function(x){
(x <= 1000) * x^2 +
(x > 1000 & x <= 2000) * x^3 +
(x > 2000 & x <= 3000) * x^4 +
(x > 4000) * x^5
}
但是,我需要能够为各种不同的断点集(即1500,2500,3500等)和不同数量的断点创建或推广此函数。另外,如果需要计算大量行,则必须对函数进行矢量化。有什么建议吗?
编辑:
为了澄清,我从一些断点表(1000,2000,3000,4000)和相关的权力提出上述函数,将x提升为(2,3,4,5)。但是,我需要能够获取多个这样的表,每个表具有不同的断点和断点数(可能有100个左右的断点),并且能够将生成的分段函数应用于大量行。
答案 0 :(得分:0)
根据我对您的示例代码的理解,您基本上希望最小化编码,并且还希望代码是动态的,以便您可以动态地改变中断和功能。
下面是示例代码,它尝试执行相同的操作。
f <- function(x, breakPoints, powerX) {
cutX <- cut(x, breaks=breakPoints)
cutX1 <- factor(cutX, labels=powerX)
retX <- x ^ as.numeric(as.character(cutX1))
retX
}
x1 <- sample(1:10000, 1000)
x1 <- x1[order(x1)]
breakPoints1 <- c(min(x1)-1, 1000, 2000, 3000, max(x1))
powerX1 <- c(2, 3, 4, 5)
newX1 <- f(x1, breakPoints1, powerX1)
head(newX1) # manual check whether the values make sense
head(x1)
此代码将执行此操作。
但我的建议是尽可能地测试这段代码,以便你可以可靠地使用它。希望这段代码对你有用。
答案 1 :(得分:0)
具有附加中断和幂参数的函数的矢量化版本可以这样写出:
function(x, breaks, power){
x^power[as.numeric(cut(x, breaks))]
}
as.numeric(cut(...))
获取中断中所有x
值的位置,然后方括号查找幂向量中的幂并将相应的x提升到正确的幂。测试:
一些突破点和权力:
> bp <- c(10,20,30,40)
> po = c(2,3,4)
请注意,断点被排除在外:
> f(9,bp,po)
[1] NA
> f(10,bp,po)
[1] NA
因此第一个有效x
必须高于10:
> f(11,bp,po)
[1] 121
按预期让我们获得11 ^ 2。所以20平方,21平方:
> f(20,bp,po)
[1] 400
> f(21,bp,po)
[1] 9261
到目前为止很好。矢量化?
> f(19:22, bp, po)
[1] 361 400 9261 10648
是 - 从正方形到立方体的变化发生在20到21之间。
如果您希望在左侧或右侧关闭区间,请参阅right
功能的cut
选项的帮助。