如何使用if ... else如果函数将数值变量分成R中的组,并且小于等于运算符显示错误

时间:2017-04-20 02:57:43

标签: r if-statement

我有两个基本问题,R代码作为标题。

假设我有一个数据集,如:

 w <- c( 0.005810275, -0.002758455, -0.005423105, -0.006692736, -0.010571356, 
        -0.006818535, -0.006943209, -0.004355057, -0.005951043, -0.002172708, 
        -0.003631478, -0.003957327, -0.005285497, -0.007682379, -0.007746185, 
        -0.011307843, -0.014013202, -0.013537595, -0.012859406, -0.013629170)

我尝试将它们分成4组,因此编写如下代码:

 n=20
group <- rep(0,n)

for (i in 1:n){
    if (W[i] <= -0.05) { group[i]=1}
    else if ( -0.05 < W[i] <= -0.03  ) {group[i]=2}
    else if (-0.03 < W[i] <= -0.01) {group[i]=3}
    else group[i]=4
}

错误消息如下:

> group <- rep(0,n)
> for (i in 1:n){
+   if (W[i] <= -0.05) { group[i]=1}
+   else if ( -0.05 < W[i] <= -0.03  ) {group[i]=2}
Error: unexpected '<=' in:
"  if (W[i] <= -0.05) { group[i]=1}
      else if ( -0.05 < W[i] <="
>   else if (-0.03 < W[i] <= -0.01) {group[i]=3}
Error: unexpected 'else' in "  else"
>   else group[i]=4
Error: unexpected 'else' in "  else"
> }
Error: unexpected '}' in "}"

我真的不知道为什么&#34;&lt; =&#34;是一个错误。

有人可以提供帮助吗?非常感谢!顺便说一句,我使用RStudio。

4 个答案:

答案 0 :(得分:4)

使用基础cut功能:

cut(w,breaks = c(-2,-0.05,-0.03,-0.01,2),labels = c(1,2,3,4),right = TRUE)

如果&#39>你可以使用right = TRUE或FALSE。如果间隔应该在右边关闭&#39;或不。 数据:

w <- c( 0.005810275, -0.002758455, -0.005423105, -0.006692736, -0.010571356, 
        -0.006818535, -0.006943209, -0.004355057, -0.005951043, -0.002172708, 
        -0.003631478, -0.003957327, -0.005285497, -0.007682379, -0.007746185, 
        -0.011307843, -0.014013202, -0.013537595, -0.012859406, -0.013629170)

答案 1 :(得分:2)

我们可以使用findInterval

findInterval(w, c(-2, -0.05, -0.03, -0.01, 2))
#[1] 4 4 4 4 3 4 4 4 4 4 4 4 4 4 4 3 3 3 3 3

答案 2 :(得分:0)

根据ed_sans的回答,

cut是要走的路。但是你的代码不起作用,因为R不明白这一点:

-0.05 < W[i] <= -0.03

以下是根据两个条件检查值的正确方法示例:

x = 5
x < 10
[1] TRUE
x > 1
[1] TRUE

1 < x < 10
Error: unexpected '<' in "1 < x <"

x > 1 & x < 10
[1] TRUE

答案 3 :(得分:0)

这应该适用于您的RStudio:

    W <- c( 0.005810275, -0.002758455, -0.005423105, -0.006692736, -0.010571356, 
    -0.006818535, -0.006943209, -0.004355057, -0.005951043, -0.002172708, 
    -0.003631478, -0.003957327, -0.005285497, -0.007682379, -0.007746185, 
    -0.011307843, -0.014013202, -0.013537595, -0.012859406, -0.013629170)

    n=20
    group <- rep(0,n)

    for (i in 1:n){
      if (W[i] < -0.05) { 
        group[i]=1} else {
          if (W[i]>= -0.05 & W[i]< -0.03) {
            group[i]=2} else {
                if (W[i]>= -0.03 & W[i]< -0.01) {
                  group[i]=3} else {group[i]=4}
            }
      }
    }

请注意,R与SAS不同。您不能在同一个赋值语句中使用两个运算符。例如,“1&lt; = x&lt; 8”在R中不起作用。您必须将其更改为逻辑语句:“x&gt; = 1&amp; x&lt; 8”将起作用。