R 将df中的负值替换为相同值除以2
我尝试编写一个函数,用相同的值除以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,
# 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顺便说一句,你不认为这会有被愚弄的机会,对吗?