使用多个条件创建变量

时间:2016-08-27 19:10:30

标签: r variables for-loop

我想在数据框NewVar中创建变量A,如果满足以下两个条件,则将其设置为1。

  1. Var0==列名Var(i)中的数字,例如Var0=4Var4
  2. 变量Var(i)不等于0:!Var(i)==0
  3. 下面是我想要实现的示意图:

    A <- read.table(text="  Var0    Var1    Var2    Var3    Var4    NewVar  
              4 0   0   0   1   1   
              4 0   0   0   0   0   
              2 0   1   0   0   1   
              2 0   0   0   0   0   
              1 1   0   0   0   1   
              1 0   0   0   0   0   
              3 0   0   1   0   1   
              3 0   0   0   0   0", header=T)
    

    我一直在尝试使用类似的东西:

    A$NewVar <- for (var in names(A[ ,2:5])) {
      ifelse(A$Var0==grep("var", colnames(A)) & A$var==1, 1, 0)
    }
    

    访问列索引,但它不起作用。

    在Excel中,我将使用match语句返回变量Var1-4中1的列索引,并使用if语句来测试列索引是否等于Var0中的值。如果是,则NewVar = 1,否则为0.

    enter image description here

    希望这使我想要做的更清楚。我正在尝试从Excel迁移到R!

1 个答案:

答案 0 :(得分:0)

以下两种方法假设:

  1. 列名称如您所述(Var1,Var2等)。
  2. 您只需使用相关单元格中的值(0或1)。
  3. 第一个选项是使用for循环,第二个选项是使用apply()

    A <- read.table(text="  Var0    Var1    Var2    Var3    Var4    NewVar  
              4 0   0   0   1   1   
              4 0   0   0   0   0   
              2 0   1   0   0   1   
              2 0   0   0   0   0   
              1 1   0   0   0   1   
              1 0   0   0   0   0   
              3 0   0   1   0   1   
              3 0   0   0   0   0", header=T)
    
    # Using a for loop...
    col_to_match <- paste0("Var", A$Var0)
    for(i in seq(col_to_match)) {
       A[i, "NewVar2"] <- A[i, col_to_match[i]]
    }
    
    # Using apply()
    A$NewVar3 <- apply(A, 1, function(i) {
      col_to_match <- paste0("Var", i["Var0"])
      i[col_to_match]
    })
    
    A
    #>   Var0 Var1 Var2 Var3 Var4 NewVar NewVar2 NewVar3
    #> 1    4    0    0    0    1      1       1       1
    #> 2    4    0    0    0    0      0       0       0
    #> 3    2    0    1    0    0      1       1       1
    #> 4    2    0    0    0    0      0       0       0
    #> 5    1    1    0    0    0      1       1       1
    #> 6    1    0    0    0    0      0       0       0
    #> 7    3    0    0    1    0      1       1       1
    #> 8    3    0    0    0    0      0       0       0
    

    只需改变&#34; NewVar2&#34;或&#34; NewVar3&#34;到&#34; NewVar&#34; (我只是添加了数字来证明)。

    如果您确实需要检查值!= 0,然后将其添加到相关行并添加as.numeric()以从布尔值获取到0/1。例如,在上面的for循环部分中:

    A[i, "NewVar2"] <- as.numeric(A[i, col_to_match[i]] != 0)
    

    apply()部分:

    as.numeric(i[col_to_match] != 0)