如何基于条件语句和dplyr创建新列?

时间:2016-03-15 05:59:30

标签: r 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 = orange)

预期结果:

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

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

如何使用mutate函数执行此操作?我知道如何直接操作数字,但不知道如何根据条件语句存储字符。

3 个答案:

答案 0 :(得分: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
))

答案 1 :(得分:1)

使用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版本完全相同,而且您的案例无关。< / LI>
  • 如果您的范围不重叠,可以使用cut更好地解决这个问题,这对于一个变量很容易实现,并且可能被一秒钟覆盖。

答案 2 :(得分: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
相关问题