【问题标题】:mutate and ifelse in specific columns with NA在具有 NA 的特定列中进行 mutate 和 ifelse
【发布时间】:2018-10-22 19:01:37
【问题描述】:

我有一个包含 6 列的大型数据框,我想根据条件进行比较并创建一个新数据框。我正在努力使用 mutate 和 ifelse,因为我在某些地方也有 NA。我的数据的一个小样本如下所示:

 dput(test)
       structure(list(value = c(1, 0, 0, 0), value_lag_1 = c(0, 1, 0, 
       0), value_lag_2 = c(NA, 0L, 0L, 0L), value_lead_1 = c(0L, 0L, 
       0L, NA), value_lead_2 = c(0L, 0L, 0L, 0L), ref = c(1, 1, 0, 1
       )), .Names = c("value", "value_lag_1", "value_lag_2", "value_lead_1", 
       "value_lead_2", "ref"), row.names = 2:5, class = "data.frame")

我想要做的是将前 5 列与最后一列(参考)进行比较。 如果前 5 列中的任何一列为 1 且 ref 为 1,则为 1,否则为 0,所以我的结果(sim)将是:

value value_lag_1 value_lag_2 value_lead_1 value_lead_2 ref sim
    1           0          NA            0            0     1   1
    0           1           0            0            0     1   1
    0           0           0            0            0     0   0
    0           0           0           NA            0     1   0

我尝试了以下方法,但没有成功:

 myvar <- names(test)[1:5]
 test%>%
          mutate(sim=ifelse( any(myvar!=0,na.rm=T) & ref==1,1,0))

有应用条件的想法吗?非常欢迎任何其他建议。

非常感谢

【问题讨论】:

    标签: r


    【解决方案1】:

    不需要ifelse,因为您的所有条件都可以轻松推断为“0”为FALSE,“非0”为TRUE

    test$sim <- rowSums(test[1:5], na.rm=TRUE) & test[[6]]
    test
    #   value value_lag_1 value_lag_2 value_lead_1 value_lead_2 ref   sim
    # 2     1           0          NA            0            0   1  TRUE
    # 3     0           1           0            0            0   1  TRUE
    # 4     0           0           0            0            0   0 FALSE
    # 5     0           0           0           NA            0   1 FALSE
    

    或文字 0/1:

    test$sim <- as.integer( rowSums(test[1:5], na.rm=TRUE) & test[[6]] )
    test
    #   value value_lag_1 value_lag_2 value_lead_1 value_lead_2 ref sim
    # 2     1           0          NA            0            0   1   1
    # 3     0           1           0            0            0   1   1
    # 4     0           0           0            0            0   0   0
    # 5     0           0           0           NA            0   1   0
    cc(4)
    # (converted)
    

    【讨论】:

    • @Jaap,感谢您的编辑,但结果不一致:即使我指定了$sim,由于名称来自test[6](单括号),分配实际上进入$ref .将其更改为test[[6]] 更加一致。谢谢,我没有看到列名不一致。
    • 太棒了!这样可行。我只是用错了方法!非常感谢
    【解决方案2】:
    test$sim <- rowSums(test[, 1:5], na.rm = T) >= 1 | test[, 6] == 1
    

    【讨论】:

      【解决方案3】:
      test$sim <- rowSums(df[, 1:5], na.rm = T) >= 1 & test$ref == 1
      
        value value_lag_1 value_lag_2 value_lead_1 value_lead_2 ref   sim
      2     1           0          NA            0            0   1  TRUE
      3     0           1           0            0            0   1  TRUE
      4     0           0           0            0            0   0 FALSE
      5     0           0           0           NA            0   1 FALSE
      

      如果您确实需要01 格式,可以将sim 转换为数字。

      【讨论】:

        【解决方案4】:

        在您开始使用 dplyr 的基础上,尝试一下

        test %&gt;% mutate(sim = ifelse(rowSums(test[1:5], na.rm = TRUE) &amp; ref == 1, 1, 0))

        test %&gt;% mutate(sim = ifelse(rowSums(test[1:5], na.rm = TRUE) &gt; 0 &amp; ref == 1, 1, 0))

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-03-03
          • 1970-01-01
          • 1970-01-01
          • 2022-01-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多