类型冲突将多个变量设置为 NA with mutate, across, case_when
Type conflict setting multiple variables to NA with mutate, across, case_when
我想使用 mutate
、across
和 case_when
的组合来将多个案例设置为 NA
(缺失)跨多个变量。
假设我有一个指示变量“vs”标记案例,对于变量“carb”和“gear”应该是 NA
。我想使用类似这样的方法将这些案例设置为同时丢失这两个变量:
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 是整数而 gear 是数字,我运行 类型冲突:
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
我想使用 mutate
、across
和 case_when
的组合来将多个案例设置为 NA
(缺失)跨多个变量。
假设我有一个指示变量“vs”标记案例,对于变量“carb”和“gear”应该是 NA
。我想使用类似这样的方法将这些案例设置为同时丢失这两个变量:
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 是整数而 gear 是数字,我运行 类型冲突:
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