如何使用IF语句分配NA?

mat*_*ats 4 if-statement r na

我想对0到1之间的值向量进行分类.值低于.001,值高于.10或不感兴趣.因此,我希望这些范围内的值为NA.

当我运行下面的代码时,我收到一个警告:

Error in if (x[i] > 0.001 & x[i] <= 0.01) x[i] = 0.01 :  missing value where TRUE/FALSE needed
Run Code Online (Sandbox Code Playgroud)

如何修复代码?

for (i in 1:length(x))
  {
    if (x[i] <= .001)
      x[i] = NA
    if (x[i] > .001 & x[i] <= .01)
      x[i] = .01
    if (x[i] > .01 & x[i] <= .02)
      x[i] = .02
    if (x[i] > .02 & x[i] <= .03)
      x[i] = .03
    if (x[i] > .03 & x[i] <= .04)
      x[i] = .04
    if (x[i] > .04 & x[i] <= .05)
      x[i] = .05
    if (x[i] > .05 & x[i] <= .06)
      x[i] = .06
    if (x[i] > .06 & x[i] <= .07)
      x[i] = .07
    if (x[i] > .07 & x[i] <= .08)
      x[i] = .08
    if (x[i] > .08 & x[i] <= .09)
      x[i] = .09
    if (x[i] > .09 & x[i] <= .10)
      x[i] = .10
    if (x[i] > .10 & x[i] <= 1)
      x[i] = NA
  }
Run Code Online (Sandbox Code Playgroud)

A5C*_*2T1 6

首先,一些测试数据:

set.seed(1); x = dnorm(rnorm(100))/(sample(1:100, 100, replace=TRUE))
Run Code Online (Sandbox Code Playgroud)

子集可以通过以下方式完成:

x[x < .001] = NA
x[x > .1] = NA
Run Code Online (Sandbox Code Playgroud)

或者,您可以将它组合在一个语句中:

x[x < .001 | x > .1] = NA
Run Code Online (Sandbox Code Playgroud)

更新:回答您的代码无法正常工作的原因

你遇到了问题,如果它没有找到一个NA在那里,所以从删除for环,但指数它们运行循环之前,所以你以后可以将其删除.

temp = which(x < .001 | x > .1) # Index the values you want to set as NA
Run Code Online (Sandbox Code Playgroud)

for循环中删除以下条件:

if (x[i] > .10 & x[i] <= 1)
  x[i] = NA
if (x[i] <= .001)
  x[i] = NA
Run Code Online (Sandbox Code Playgroud)

运行for循环,然后使用temp设置值NA应该是NA.

x[temp] = NA
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!

更新2:两行

x[x < .001 | x > .1] = NA
out <- ceiling(x*100)/100
Run Code Online (Sandbox Code Playgroud)

与AKE使用地板的建议几乎相同.

这应该会得到与循环相同的结果.