类型冲突将多个变量设置为NA WITH MATERATE、CROSS、CASE_WHEN [英] Type conflict setting multiple variables to NA with mutate, across, case_when

查看:26
本文介绍了类型冲突将多个变量设置为NA WITH MATERATE、CROSS、CASE_WHEN的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我要组合使用mutateacrosscase_when来跨多个变量将某些大小写设置为NA(缺少)。

假设我有一个指示器变量";vs";标记案例,对于变量";carb";和";Gear";应该NA。我想使用类似下面的代码将这两个变量的大小写同时设置为MISSING:

data(mtcars) #load mtcars data
mtcars$carb <- as.integer(mtcars$carb) #set to integer,
                                       #for purposes of illustration

mtcars <- mtcars %>%
  mutate(across(c(gear:carb), ~ case_when(vs==1~NA,
                                      T~.)))

对于";vs";等于1的所有情况,我希望将";Gear";和";carb";更改为NA。但是,由于carb是整数而齿轮是数字,我遇到了类型冲突:

Error: Problem with `mutate()` input `..1`.
ℹ `..1 = across(c(gear:carb), ~case_when(vs == 1 ~ NA, T ~ .))`.
x must be a logical vector, not a double vector.
如果我分别对每个变量使用mutate,我会将NA替换为NA_integer_(表示‘carb’),将NA替换为NA_real_(表示‘GEAR’)。我不能在这里这样做,因为变量包含不同类型的数据。

有什么办法可以解决这个问题吗?或者我只能对相同类型的变量使用mutate(across())这样的方法吗?

谢谢!

推荐答案

另一个选项是使用if语句:

library(dplyr)

mtcars$carb <- as.integer(mtcars$carb)

mtcars <- mtcars %>%
  mutate(across(c(gear:carb), ~ case_when(
    vs == 1 ~ if (is.integer(.)) NA_integer_ else NA_real_,
    T ~ .
  )))

但是,由于@r2evans的评论,我学到的更聪明的方法是使用.[NA],它将始终提供适当的NA类型:

mtcars <- mtcars %>%
  mutate(across(c(gear:carb), ~ case_when(
    vs == 1 ~ .[NA],
    T ~ .
  )))

head(mtcars)
#>                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
#> Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
#> Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
#> Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1   NA   NA
#> Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0   NA   NA
#> Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
#> Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0   NA   NA

这篇关于类型冲突将多个变量设置为NA WITH MATERATE、CROSS、CASE_WHEN的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆