我尝试编写一个函数,用相同的值除以2来替换向量中的值。
# replacement function for a vector
rep <- function(x)
x.half <- {abs(replace(x, which(x<0),x/2))}
但是,我知道这个函数不能正常工作,因为如果我模拟带有负数和正数的向量,我会得到错误的结果:
a <- c(1,-1,2,-2,3,-3,4,-4,5,-5,11,-11,12,-12,13,-13,21,-21,25,-25)
a.rep <- rep(a)
# data frame to test
test <- cbind(a,a.rep)
此外,当我将此函数应用于向量a时,我收到如下警告消息:
警告讯息: 在replace(x,which(x <0),x / 2)中: 要替换的项目数量不是替换长度的倍数
显然,我的功能有问题。
答案 0 :(得分:5)
replace
中的第三个参数需要与第二个中的子集相同的长度。
## determine which values are below zero
a0 <- a < 0
## replace them with their halved values
replace(a, a0, a[a0] / 2)
[1] 1.0 -0.5 2.0 -1.0 3.0 -1.5 4.0 -2.0 5.0 -2.5 11.0
[12] -5.5 12.0 -6.0 13.0 -6.5 21.0 -10.5 25.0 -12.5
答案 1 :(得分:5)
虽然这个问题已经得到解答,但我觉得有必要添加一个算术解决方案。
表达式
(sign(a) + 3) / 4 * a
将返回
# [1] 1.0 -0.5 2.0 -1.0 3.0 -1.5 4.0 -2.0 5.0 -2.5 11.0 -5.5 12.0 -6.0 13.0 -6.5
#[17] 21.0 -10.5 25.0 -12.5
按要求。
工作原理
要求是
1/2
,这可以翻译为
sign(a) == -1
则将a
乘以1/2
sign(a) == +1
则将a
乘以1
现在,我们需要找到满足方程的线性函数 y = f(x)= p * x + q
解决了 p 和 q 之后,得到 f(x)= 1/4 * x + 3/4 。使用 x = sign( a
),将a
的每个元素乘以的因子是:
1/4 *符号( a
)+ 3/4
答案 2 :(得分:4)
您可以使用ifelse()
:
half_if_neg <- function(x) {ifelse(x < 0, x / 2, x)}
#sapply(a, half_if_neg)
half_if_neg(a)
答案 3 :(得分:2)
我们也可以进行作业
i1 <- a < 0
a[i1] <- a[i1]/2
或使用
pmax(a, (a*NA^(a >=0))/2, na.rm = TRUE)
#[1] 1.0 -0.5 2.0 -1.0 3.0 -1.5 4.0 -2.0 5.0 -2.5 11.0
#[12] -5.5 12.0 -6.0 13.0 -6.5 21.0 -10.5 25.0 -12.5