【问题标题】:Create a new variable based on any 2 conditions being true根据任意 2 个条件为真创建一个新变量
【发布时间】:2020-07-23 17:51:30
【问题描述】:

我在 R 中有一个包含 4 个变量的数据框,并希望根据这些变量的任何 2 个条件为真创建一个新变量。 我试图通过 if/else 语句创建它,但是需要对每个变量条件进行排列为真。我还需要扩展到可以根据任何 3 个条件为真创建新变量的位置。我不确定是否有比使用 if/else 语句更有效的方法?

我的例子: 我有一个带有以下列变量的数据框 X

x1 = c(1,0,1,0)
X2 = c(0,0,0,0)
X3 = c(1,1,0,0)
X4 = c(0,0,1,0)

如果任何 2 个变量为真(例如 ==1),我想创建一个新变量 X5 基于上述数据框的新变量将产生 X5 (1,0,1,0)

【问题讨论】:

    标签: r variables binary-data


    【解决方案1】:

    这可以通过使用apply 函数轻松完成:

    x1 = c(1,0,1,0)
    x2 = c(0,0,0,0)
    x3 = c(1,1,0,0)
    x4 = c(0,0,1,0)
    
    df <- data.frame(x1,x2,x3,x4)
    
    df$x5 <- apply(df,1,function(row) ifelse(sum(row != 0) == 2, 1, 0))
    
      x1 x2 x3 x4 X5
    1  1  0  1  0  1
    2  0  0  1  0  0
    3  1  0  0  1  1
    4  0  0  0  0  0
    

    apply 带有选项 1 表示:在每一行上执行此功能。要将其扩展到 3...N 个真实值,只需更改 ifelse 语句中的数字即可。

    【讨论】:

      【解决方案2】:

      你可以试试这个:

      #Data
      df <- data.frame(x1,X2,X3,X4)
      #Code
      df$X5 <- ifelse(rowSums(df,na.rm=T)==2,1,0)
      
        x1 X2 X3 X4 X5
      1  1  0  1  0  1
      2  0  0  1  0  0
      3  1  0  0  1  1
      4  0  0  0  0  0
      

      【讨论】:

      • 您可以将其简化为+(rowSums(df) == 2)
      【解决方案3】:

      你可以使用:

      df$X5 <- 1*(apply(df == 1, 1, sum)  == 2)
      

      df$X5 <- 1*(mapply(sum, df) == 2)
      

      输出

      > df
      X1 X2 X3 X4 X5
      1  0  1  0  1
      0  0  1  0  0
      1  0  0  1  1
      0  0  0  0  0
      

      数据

      df <- data.frame(X1,X2,X3,X4)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-08-13
        • 2022-07-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-28
        • 1970-01-01
        相关资源
        最近更新 更多