繁体   English   中英

如何根据条件语句和 dplyr 创建新列?

[英]How can I create a new column based on conditional statements and dplyr?

x y
2 4
5 8
1 4
9 12

我有四个条件

  • maxx = 3, minx = 1, maxy = 6, miny = 3. (如果 minx < x < maxx 且 miny < y < maxy,则 z = apple)
  • maxx = 6, minx = 4, maxy = 9, miny = 7. (如果 minx < x < maxx 且 miny < y < maxy,则 z = ball)
  • maxx = 2, minx = 0, maxy = 5, miny = 3. (如果 minx < x < maxx 且 miny < y < maxy,则 z = pine)
  • maxx = 12, minx = 7, maxy = 15, miny = 11.(如果 minx < x < maxx 且 miny < y < maxy,则 z = 橙色)

预期结果:

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

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

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

我相信这里最好的选择是使用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

替代答案:

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
))

使用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辅助函数,可以将您的条件减少到每个调用两次,但它使用<=>= ,因此您需要重新配置端点。
  • 您可以使用switch ,但您的所有条件都需要在第一项中,最终看起来与ifelse版本完全相同,并且您的案例将无关紧要。
  • 如果您的范围不重叠,用cut可以更好地解决这个问题,这对于一个变量很容易实现,并且可以被一秒覆盖。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM