Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 将df中的负值替换为相同值除以2_R_Function - Fatal编程技术网

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

R 将df中的负值替换为相同值除以2,r,function,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,

我尝试编写一个函数,用相同的值除以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时,会得到如下警告消息:

警告信息: 在replacex中,x<0,x/2: 要替换的项目数不是替换长度的倍数

显然,我的函数有问题。

您可以使用ifelse:

您可以使用ifelse:

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

我们也可以做作业

i1 <- a < 0
a[i1] <- a[i1]/2

我们也可以做作业

i1 <- a < 0
a[i1] <- a[i1]/2

虽然这个问题已经得到了回答,但我觉得有必要添加一个算术解

表情

(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, 正数不应更改。 这可以翻译为

如果signa==-1,则将a乘以1/2 如果signa==+1,则将a乘以1 现在,我们需要找到一个线性函数y=fx=p*x+q,它满足这些方程

f-1=-p+q=1/2 f1=p+q=1。 求解p和q后,我们得到fx=1/4*x+3/4。当x=signa时,将a的每个元素乘以的系数为:


1/4*signa+3/4

虽然问题已经得到了回答,但我觉得有必要添加一个算术解

表情

(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, 正数不应更改。 这可以翻译为

如果signa==-1,则将a乘以1/2 如果signa==+1,则将a乘以1 现在,我们需要找到一个线性函数y=fx=p*x+q,它满足这些方程

f-1=-p+q=1/2 f1=p+q=1。 求解p和q后,我们得到fx=1/4*x+3/4。当x=signa时,将a的每个元素乘以的系数为:


1/4*signa+3/4

这是我函数的一个非常简短的版本,很好。但是我只需要将负值减半,所有正值都不能改变他刚刚意识到这是最好最短的回答:D谢谢@ChirayuChamoli@mariansess谢谢你的评论。这是我函数的一个非常简短的版本,很好。但是我只需要将负值减半,所有正值都不能更改。a他刚刚意识到这是最好最短的回答:D谢谢@ChirayuChamoli@mariansess谢谢你的好意。如果其他是矢量化的,那么对Sapply的需求如果其他是矢量化的,那么对Sapply的需求也是矢量化的sapply@RichScriven这是另一种方法。我相信你的替换方法也是非常新颖的。@RichScriven我没有发现任何人使用t如果你是在谈论评论,很抱歉我没有检查评论。不管怎样,我还添加了一个替代方法,它非常新颖wel@RichScriven顺便说一句,你不认为这会有被愚弄的机会,对吗?@RichScriven这是一种替代方法。我相信你的替换方法也很有独创性。@RichScriven我没有发现任何人在回答中使用这个。如果你是在谈论评论,很抱歉我没有检查评论。无论如何,我还添加了另一种非常新颖的方法,如wel@RichScriven顺便说一句,你不认为这会有被愚弄的机会,对吗?