R 将负值替换为零

R 将负值替换为零,r,if-statement,for-loop,conditional-statements,rcpp,R,If Statement,For Loop,Conditional Statements,Rcpp,我们要将数组中的所有值设置为零,这些值都是负数 我尝试了很多东西,但还没有找到有效的解决方案。 我考虑了一个带有条件的for循环,但是这似乎不起作用 #pred_precipitation is our array pred_precipitation <-rnorm(25,2,4) for (i in nrow(pred_precipitation)) { if (pred_precipitation[i]<0) {pred_precipitation[i] = 0

我们要将数组中的所有值设置为零,这些值都是负数

我尝试了很多东西,但还没有找到有效的解决方案。 我考虑了一个带有条件的for循环,但是这似乎不起作用

#pred_precipitation is our array
pred_precipitation <-rnorm(25,2,4)     

for (i in nrow(pred_precipitation))
{
  if (pred_precipitation[i]<0) {pred_precipitation[i] = 0}
  else{pred_precipitation[i] = pred_precipitation[i]}
}
#pred#u降水是我们的数组

pred_沉淀感谢可重复的示例。这是非常基本的R的东西。您可以指定给向量的选定元素(请注意,数组有维度,您所给出的是向量而不是数组):


不幸的是,这扼杀了速度优势。

或者,您也可以使用
ifelse

ifelse(pred_precipitation < 0, 0, pred_precipitation)
ifelse(pred_降水量<0,0,pred_降水量)

我会使用
pmax
,因为
ifelse
有时会有点慢,子集替换会创建一个额外的向量(这可能是大型数据集的问题)

set.seed(21)

pred_deposition如果您的主要对象是tibble或数据帧,那么您也可以使用tidy软件包。与Ari B.Friedman提出的替代方案相比,替代方案可以“即时”编写,并与其他突变相结合

使用dplyr和
%%>%%
管道的示例如下所示:

df %>% mutate(varA = if_else(varA < 0, 0, varA))
df%>%变异(varA=if_else(varA<0,0,varA))
您可以在
mutate()
语句中添加更多的突变(即新变量)。我在这种类型的编码中看到的一个优点是,您不会冒跳过或重新执行单个转换步骤的风险,因为它们都分组在一个语句中。
例如,通过在RStudio中添加
%>%View()
,您可以预览结果。但是,结果尚未存储在任何位置(“动态”)。这样,在更改代码时可以保持命名空间/环境的干净。

+1表示基准测试。添加了一个计时图(在
taRifx
包中使用
autoplot.microbenchmark
)@gsk3:wow,你做了什么让我的解决方案变得更糟了P
(abs(P)+P)/2
似乎更快
pmax也“已知”斯洛维更相信微基准的结果,而不是rbenchmark——它使用了更高精度的计时器,并以rbenchmark无法做到的方式随机排列复制顺序。Ari和@DirkEddelbuettel:它真的在不指定的情况下修改
p
?“当我尝试它的时候,它似乎不是。”亚伦在这里看到了德克的解释:
library(inline)
cpp_if_src <- '
  Rcpp::NumericVector xa(a);
  int n_xa = xa.size();
  for(int i=0; i < n_xa; i++) {
    if(xa[i]<0) xa[i] = 0;
  }
  return xa;
'
cpp_if <- cxxfunction(signature(a="numeric"), cpp_if_src, plugin="Rcpp")
microbenchmark(joshua(p),joshua.c(p),gsk3(p),gsk3.c(p),jmsigner(p),james(p),jmsigner.c(p),james.c(p), cpp_if(p))
         expr      min        lq    median        uq       max
1   cpp_if(p)    8.233   10.4865   11.6000   12.4090    69.512
2     gsk3(p)  170.572  172.7975  175.0515  182.4035  2515.870
3    james(p)   37.074   39.6955   40.5720   42.1965  2396.758
4 jmsigner(p) 1110.313 1118.9445 1133.4725 1164.2305 65942.680
5   joshua(p)  237.135  240.1655  243.3990  250.3660  2597.429
cpp_ifclone_src <- '
  Rcpp::NumericVector xa(Rcpp::clone(a));
  int n_xa = xa.size();
  for(int i=0; i < n_xa; i++) {
    if(xa[i]<0) xa[i] = 0;
  }
  return xa;
'
cpp_ifclone <- cxxfunction(signature(a="numeric"), cpp_ifclone_src, plugin="Rcpp")
ifelse(pred_precipitation < 0, 0, pred_precipitation)
set.seed(21)
pred_precipitation <- rnorm(25,2,4)
p <- pmax(pred_precipitation,0)
library(rbenchmark)
gsk3 <- function(x) { x[x<0] <- 0; x }
jmsigner <- function(x) ifelse(x<0, 0, x)
joshua <- function(x) pmin(x,0)
benchmark(joshua(p), gsk3(p), jmsigner(p), replications=10000, order="relative")
         test replications elapsed relative user.self sys.self
2     gsk3(p)        10000   0.215 1.000000     0.216    0.000
1   joshua(p)        10000   0.444 2.065116     0.416    0.016
3 jmsigner(p)        10000   0.656 3.051163     0.652    0.000
df %>% mutate(varA = if_else(varA < 0, 0, varA))