将df中的负值替换为相同的值除以2

时间:2017-02-04 04:07:11

标签: r function

我尝试编写一个函数,用相同的值除以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)中:     要替换的项目数量不是替换长度的倍数

显然,我的功能有问题。

4 个答案:

答案 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

  • f(-1)= -p + q = 1/2
  • f(1)= p + q = 1

解决了 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