[英]How can I create a new column based on conditional statements and dplyr?
x y
2 4
5 8
1 4
9 12
我有四个条件
预期结果:
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.