【问题标题】:How to create a new column based off OR and AND statements in R?如何基于 R 中的 OR 和 AND 语句创建新列?
【发布时间】:2021-11-06 10:39:21
【问题描述】:
        None       Pain    Swelling    Tiredness     Headache     Nausea     Malaise     Lymph
1        0         1          0             0            0          0           1         0
2        0         0          1             0            0          0           0         0
3        0         0          0             0            1          0           0         0
4        1         0          0             0            0          0           0         0
5        1         0          1             0            0          0           0         0
6        0         1          0             1            0          0           0         0

我在上面有一个带有症状的 df。我想创建一个新的数据框,创建一个也是二进制的列“OnlyPainOrSwelling”。如果疼痛或肿胀为 1,我希望该列中为 1,但是,如果有任何其他症状,那么我希望该列中为 0。例如,在第 6 行,有疼痛症状,但也有疲倦,所以我想在新列中有一个 0。我试过 OR 和 AND 语句无济于事。帮忙?

新的df:

        None       Pain    Swelling    Tiredness     Headache     Nausea     Malaise     Lymph   OnlyPainorSwelling
1        0         1          0             0            0          0           1         0          1
2        0         0          1             0            0          0           0         0          1
3        0         0          0             0            1          0           0         0          0 
4        1         0          0             0            0          0           0         0          0
5        0         0          1             0            0          0           0         0          1
6        0         1          0             1            0          0           0         0          0

我试过了:

df$OnlyPainorSwelling <- 1L * (df$Pain == 1 |
                        df$Swelling == 1 &
                        df$Tiredness == 0 &
                        df$Headache == 0 &
                        df$Nausea = 0 &
                        df$Malaise == 0 &
                        df$Lymph == 0 &)

【问题讨论】:

    标签: r dataframe conditional-statements


    【解决方案1】:

    dplyr 解决方案

    dplyr 的if_anyif_all 是对data.frames 进行行逻辑操作的绝佳选择,这使得代码非常易于理解和实现。 使用@Gregor Thomas 指定的向量,我们可以使用dplyr::if_any

    library(dplyr)
    
    df %>% mutate(onlyPainOrSwelling = +(if_any(pain_swell) & !if_any(other_symptoms)))
    

    在这个解决方案中,我们还受益于数字变量到逻辑的隐式强制(0 被强制为 FALSE,1 被强制为 TRUE)。 我们可以使用.x==1 使其更明确:

    df %>% mutate(onlyPainOrSwelling = +(if_any(pain_swell, ~.x==1) & !if_any(other_symptoms, ~.x==1))))
    

    输出

    # A tibble: 6 x 10
       None  Pain Swelling Tiredness Headache Nausea Malaise Lymph OnlyPainorSwelling
      <dbl> <dbl>    <dbl>     <dbl>    <dbl>  <dbl>   <dbl> <dbl>              <dbl>
    1     0     1        0         0        0      0       1     0                  1
    2     0     0        1         0        0      0       0     0                  1
    3     0     0        0         0        1      0       0     0                  0
    4     1     0        0         0        0      0       0     0                  0
    5     0     0        1         0        0      0       0     0                  1
    6     0     1        0         1        0      0       0     0                  0
    

    数据

    df<-read_table("None       Pain    Swelling    Tiredness     Headache     Nausea     Malaise     Lymph   OnlyPainorSwelling
     0         1          0             0            0          0           1         0          1
    0         0          1             0            0          0           0         0          1
    0         0          0             0            1          0           0         0          0 
    1         0          0             0            0          0           0         0          0
    0         0          1             0            0          0           0         0          1
    0         1          0             1            0          0           0         0          0")
    
    pain_swell = c("Pain", "Swelling")
    other_symptoms = c("Tiredness", "Headache", "Nausea", "Malaise", "Lymph")
    

    【讨论】:

      【解决方案2】:

      您在疼痛和肿胀部分周围缺少括号。最后你还有一个额外的&amp;。修复这些,我们可以得到:

      df$OnlyPainorSwelling <- 1L * (
          (df$Pain == 1 | df$Swelling == 1 ) &
          df$Tiredness == 0 &
          df$Headache == 0 &
          df$Nausea = 0 &
          df$Malaise == 0 &
          df$Lymph == 0
      )
      

      但是,为了便于阅读,我会推荐这种方法:

      pain_swell = c("Pain", "Swelling")
      other_symptoms = c("Tiredness", "Headache", "Nausea", "Malaise", "Lymph")
      
      df$OnlyPainorSwelling <- as.integer(
        rowSums(df[pain_swell]) > 0 & rowSums(df[other_symptoms]) == 0
      )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-08
        • 2021-12-24
        • 1970-01-01
        • 1970-01-01
        • 2017-05-23
        • 2010-12-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多