用dplyr更改变量的值

luc*_*ano 92 r plyr dataframe dplyr

我经常需要根据不同变量的值更改变量的值,如下所示:

mtcars$mpg[mtcars$cyl == 4] <- NA
Run Code Online (Sandbox Code Playgroud)

我尝试过这样做,dplyr但悲惨地失败了:

mtcars %>%
mutate(mpg = mpg == NA[cyl == 4]) %>%
as.data.frame()
Run Code Online (Sandbox Code Playgroud)

我怎么能这样做dplyr

akr*_*run 233

我们可以使用replace'mpg'中的值更改为NA对应的值cyl==4.

mtcars %>%
     mutate(mpg=replace(mpg, cyl==4, NA)) %>%
     as.data.frame()
Run Code Online (Sandbox Code Playgroud)

  • @iago与“ replace”一起,您还需要将“ values”子集化,即“ replace(mpg,cyl == 4,qsec [cyl == 4])”,因为替换值正在选择整列 (2认同)
  • @iago是的,带有NA的==返回NA,您可以改用%in% (2认同)

Qui*_*ten 7

这是使用简单的另一个选项ifelse

library(dplyr)
mtcars %>%
  mutate(mpg = ifelse(cyl == 4, NA, mpg))
Run Code Online (Sandbox Code Playgroud)

输出头:

#>                      mpg cyl  disp  hp drat    wt  qsec vs am gear carb
#> Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
#> Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
#> Datsun 710            NA   4 108.0  93 3.85 2.320 18.61  1  1    4    1
#> Hornet 4 Drive      21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
#> Hornet Sportabout   18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
Run Code Online (Sandbox Code Playgroud)

另一种选择是使用case_when它可以扩展到更多条件:

mtcars %>%
  mutate(mpg = case_when(cyl == 4 ~ NA,
                         TRUE ~ mpg))
Run Code Online (Sandbox Code Playgroud)