R:基于2列中的值创建列

时间:2018-03-28 05:26:51

标签: r

我想插入列Coins/Copay并根据5个条件指定值1,0:

  1. (计划A,B,C) - 列出了Coins金额,但是NA Copay - > Coins/Copay = 1
  2. (计划D,E) - 列出了Copay金额,但是NA Coins - > Coins/Copay = 0
  3. (计划F) - CoinsCopay金额= 0 - > Coins/Copay = 0
  4. (计划G,H) - 列出CoinsCopay金额,但Copay不= 0 - > Coins/Copay = 0
  5. (计划I,J) - Coins大于CopayCopay = 0 - > Coins/Copay = 1
  6. 使用以下数据集:

    Plans   Coins   Copay
      A       0       NA
      B       0       NA
      C      10       NA
      D      NA        0
      E      NA       50
      F       0        0
      G      20       10
      H      40        5
      I      20        0
      J       5        0
    

    我希望结果是:

        Plans   Coins   Copay  Coins/Copay
          A       0       NA        1
          B       0       NA        1
          C      10       NA        1
          D      NA        0        0
          E      NA       50        0
          F       0        0        0
          G      20       10        0
          H      40        5        0
          I      20        0        1
          J       5        0        1
    

    对不起,如果这令人困惑!非常感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

您实际上只需要指定Coins.Copay == 1个案例,其余的默认为0

 library(tidyverse);
 df %>%
   mutate(Coins.Copay = case_when(
       Plans %in% c("A", "B", "C") & !is.na(Coins) & is.na(Copay) ~ 1,
       Plans %in% c("I", "J") & Coins > Copay & Copay == 0 ~ 1,
       TRUE ~ 0
   ))
#   Plans Coins Copay Coins.Copay
#1      A     0    NA           1
#2      B     0    NA           1
#3      C    10    NA           1
#4      D    NA     0           0
#5      E    NA    50           0
#6      F     0     0           0
#7      G    20    10           0
#8      H    40     5           0
#9      I    20     0           1
#10     J     5     0           1

答案 1 :(得分:0)

使用case_when包中的dplyr

df$`Coins/Copay` <- case_when(
    df$Plans %in% c('A', 'B', 'C') & !is.na(df$Coins) & is.na(df$Copay) ~ 1,
    df$Plans %in% c('D', 'E') & is.na(df$Coins) & !is.na(df$Copay) ~ 0,
    df$Plans = 'F' & df$Coins == 0 & df$Copay == 0 ~ 0,
    df$Plans %in% c('G', 'H') & !is.na(df$Coins) & !is.na(df$Copay)
        & df$Copy != 0 ~ 0,
    df$Plans %in% c('I', 'J') & df$Coins > df$Copay & df$Copy = 0 ~ 1
    TRUE ~ 0    # default value is zero
)

答案 2 :(得分:0)

我不确定我是否正在阅读你的第五个条件,但是如果你的意思是当Copay == 0&amp;时,CoinsCopay应该是1硬币不是NA或0,你可以用基数R:

df$CoinsCopay <- ifelse((!is.na(df$Coins) & is.na(df$Copay)) | (!df$Coins %in% c(0,NA) & df$Copay %in% 0), 1, 0)

> df
   Plans Coins Copay CoinsCopay
1      A     0    NA          1
2      B     0    NA          1
3      C    10    NA          1
4      D    NA     0          0
5      E    NA    50          0
6      F     0     0          0
7      G    20    10          0
8      H    40     5          0
9      I    20     0          1
10     J     5     0          1