【问题标题】:How can I create a new column based on conditional statements and dplyr?如何根据条件语句和 dplyr 创建新列?
【发布时间】:2016-03-15 05:59:29
【问题描述】:
x y
2 4
5 8
1 4
9 12

我有四个条件

  • maxx = 3,minx = 1,maxy = 6,miny = 3。(如果 minx
  • maxx = 6,minx = 4,maxy = 9,miny = 7。(如果 minx
  • maxx = 2,minx = 0,maxy = 5,miny = 3。(如果 minx
  • maxx = 12,minx = 7,maxy = 15,miny = 11。(如果 minx

预期结果:

x y z
2 4 apple
5 8 ball
1 4 pine 
9 12 orange

我有数千行,这四个条件适合所有值。

如何使用 mutate 函数做到这一点?我知道如何直接操作数字,但不确定如何根据条件语句存储字符。

【问题讨论】:

  • 你可以嵌套ifelses,但它会变得很乱。
  • yx 不满足任何条件时会发生什么?或者他们满足不同的条件?
  • @DavidArenburg 我想要那里的 NA。但我认为我的数据中没有任何行不符合条件。但是,是的。
  • @alistaire 我认为 ifelse 不适合这里......如果我需要的话(我认为),它更等同于 switch 语句。也许我错了。请随意举个例子。
  • 我也可以使用非 dplyr 解决方案。

标签: r dplyr


【解决方案1】:

我相信这里最好的选择是使用dplyr::case_when

df %>% mutate(z = case_when(
    x < 3  & x > 1 & y < 6  & y > 3  ~ "apple" ,
    x < 6  & x > 4 & y < 9  & y > 7  ~ "ball"  ,
    x < 2  & x > 0 & y < 5  & y > 3  ~ "pine"  ,
    x < 12 & x > 7 & y < 15 & y > 11 ~ "orange"
  )
)

这给了我们:

# A tibble: 4 x 3
      x     y z     
  <dbl> <dbl> <chr> 
1     2     4 apple 
2     5     8 ball  
3     1     4 pine  
4     9    12 orange

【讨论】:

    【解决方案2】:

    另一种答案:

    library(mosaic)
    df <- mutate(df, fruit = derivedFactor(
      "apple" = (x<3 & x>1 & y<6 & y>3),
      "ball" = (x<6 & x>4 & y<9 & y>7),
      "pine" = (x<2 & x>0 & y<5 & y>3),
      "orange" = (x<12 & x>7 & y<15 & y>11),
       method ="first",
      .default = NA
    ))
    

    【讨论】:

      【解决方案3】:

      使用ifelse,是

      df %>% mutate(z = ifelse(x<3 & x>1 & y<6 & y>3, 'apple', 
                               ifelse(x<6 & x>4 & y<9 & y>7, 'ball',
                                      ifelse(x<2 & x>0 & y<5 & y>3, 'pine',
                                             ifelse(x<12 & x>7 & y<15 & y>11, 'orange', NA))))
      )
      
      #   x  y      z
      # 1 2  4  apple
      # 2 5  8   ball
      # 3 1  4   pine
      # 4 9 12 orange
      

      注意事项:

      • 如果您有符合两个条件 (x = 1.5, y = 4) 的案例,这将失败。
      • dplyr 也有一个 between 辅助函数,可以将条件减少到每个调用两次,但它使用 &lt;=&gt;=,因此您需要重新配置端点。
      • 您可以使用switch,但您的所有条件都需要在第一学期,最终看起来与ifelse 版本完全一样,您的案例将与任何事情无关。
      • 如果您的范围不重叠,最好使用cut 解决这个问题,这对于一个变量很容易实现,并且可以在一秒钟内被覆盖。

      【讨论】:

      • 谢谢。我还发布了一个不同的答案,但没有使用 ifelse 语句。不确定哪个更好。
      猜你喜欢
      • 2019-08-27
      • 2021-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-02
      相关资源
      最近更新 更多