I am sure the solution is a one liner, but I am banging my head against the wall. See the very short reprex at the end of the post; how do I tell dplyr that I want to double only the columns without NA?
Many thanks
library(dplyr)
#>
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#>
#> filter, lag
#> The following objects are masked from 'package:base':
#>
#> intersect, setdiff, setequal, union
df <- tibble(x=1:10, y=101:110,
w=c(6,NA,4,NA, 5,0,NA,4,8,17 ),
z=c(2,3,4,NA, 5,10,22,34,58,7 ),
k=rep("A",10))
df
#> # A tibble: 10 x 5
#> x y w z k
#> <int> <int> <dbl> <dbl> <chr>
#> 1 1 101 6 2 A
#> 2 2 102 NA 3 A
#> 3 3 103 4 4 A
#> 4 4 104 NA NA A
#> 5 5 105 5 5 A
#> 6 6 106 0 10 A
#> 7 7 107 NA 22 A
#> 8 8 108 4 34 A
#> 9 9 109 8 58 A
#> 10 10 110 17 7 A
df %>% mutate(across(where(is.numeric), ~.x*2))
#> # A tibble: 10 x 5
#> x y w z k
#> <dbl> <dbl> <dbl> <dbl> <chr>
#> 1 2 202 12 4 A
#> 2 4 204 NA 6 A
#> 3 6 206 8 8 A
#> 4 8 208 NA NA A
#> 5 10 210 10 10 A
#> 6 12 212 0 20 A
#> 7 14 214 NA 44 A
#> 8 16 216 8 68 A
#> 9 18 218 16 116 A
#> 10 20 220 34 14 A
##now double the value of all the columns without NA. How to fix this...
df %>% mutate(across(where(sum(is.na(.x))==0), ~.x*2))
#> Error: Problem with `mutate()` input `..1`.
#> ✖ object '.x' not found
#> ℹ Input `..1` is `across(where(sum(is.na(.x)) == 0), ~.x * 2)`.
Created on 2020-10-27 by the reprex package (v0.3.0.9001)
Note that the aim is to select columns that dont have NA any that are numeric. Recall that the input to where
must be a function. in your case just do:
df %>% mutate(across(where(~is.numeric(.) & sum(is.na(.x))==0), ~.x*2))
Well to give you other ways:
df %>% mutate(across(where(~!anyNA(.) & is.numeric(.)), ~.*2))
# A tibble: 10 x 5
x y w z k
<dbl> <dbl> <dbl> <dbl> <chr>
1 2 202 6 2 A
2 4 204 NA 3 A
3 6 206 4 4 A
4 8 208 NA NA A
5 10 210 5 5 A
6 12 212 0 10 A
7 14 214 NA 22 A
8 16 216 4 34 A
9 18 218 8 58 A
10 20 220 17 7 A
If you know how to use the negate function:
df %>% mutate(across(where(~Negate(anyNA)(.) & is.numeric(.)), ~.*2))