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函数执行此操作?我知道如何直接操作数字,但不知道如何根据条件语句存储字符。
答案 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