Использование mutate_if и replace_na для замены всех результатов на основе условия - PullRequest
0 голосов
/ 16 июня 2020

У меня есть набор данных, аналогичный набору данных mtcars.

                    mpg cyl disp  hp drat  wt qsec vs am gear carb
Mazda RX4            21   6  160 110  3.9 2.6   16  0  1    4    4
Mazda RX4 Wag        21   6  160 110  3.9 2.9   17  0  1    4    4
Datsun 710           23   4  108  93  3.9 2.3   19  1  1    4    1
Hornet 4 Drive       21   6  258 110  3.1 3.2   19  1  0    3    1
Hornet Sportabout    19   8  360 175  3.1 3.4   17  0  0    3    2
Valiant              18   6  225 105  2.8 3.5   20  1  0    3    1

Я хочу заменить все строки на основе некоторого условия. т.е. mpg > 20 и cyl = 6, поэтому он вернется.

                    mpg cyl disp  hp drat  wt qsec vs am gear carb
Mazda RX4            NA  NA  NA   NA  NA   NA  NA  NA NA  NA   NA
Mazda RX4 Wag        NA  NA  NA   NA  NA   NA  NA  NA NA  NA   NA
Datsun 710           23   4  108  93  3.9 2.3   19  1  1    4    1
Hornet 4 Drive       NA  NA  NA   NA  NA   NA  NA  NA NA  NA   NA
Hornet Sportabout    19   8  360 175  3.1 3.4   17  0  0    3    2
Valiant              18   6  225 105  2.8 3.5   20  1  0    3    1

Кроме того, я хотел бы заменить только определенные столбцы на НП на основе того же условия. То есть заменить только столбцы disp., hp и drat.

Ответы [ 2 ]

3 голосов
/ 16 июня 2020

Вот подход с недавно выпущенной функциональностью across (версия >= 1.0.0):

mymtcars %>% 
  rownames_to_column("car") %>%
  mutate(across(c(disp, hp, drat),
                ~ if_else(mpg > 20 & cyl == 6, NA_real_, as.numeric(.))))
#                car mpg cyl disp  hp drat  wt qsec vs am gear carb
#1         Mazda RX4  21   6   NA  NA   NA 2.6   16  0  1    4    4
#2     Mazda RX4 Wag  21   6   NA  NA   NA 2.9   17  0  1    4    4
#3        Datsun 710  23   4  108  93  3.9 2.3   19  1  1    4    1
#4    Hornet 4 Drive  21   6   NA  NA   NA 3.2   19  1  0    3    1
#5 Hornet Sportabout  19   8  360 175  3.1 3.4   17  0  0    3    2
#6           Valiant  18   6  225 105  2.8 3.5   20  1  0    3    1

Самая сложная часть здесь заключается в том, что некоторые столбцы являются двойными, а некоторые - целыми числами, поэтому у вас есть сделать что-то, чтобы убедиться, что оба типа столбцов могут обрабатываться одной и той же функцией.

Пример данных

mymtcars <- structure(list(mpg = c(21L, 21L, 23L, 21L, 19L, 18L), cyl = c(6L, 
6L, 4L, 6L, 8L, 6L), disp = c(160L, 160L, 108L, 258L, 360L, 225L
), hp = c(110L, 110L, 93L, 110L, 175L, 105L), drat = c(3.9, 3.9, 
3.9, 3.1, 3.1, 2.8), wt = c(2.6, 2.9, 2.3, 3.2, 3.4, 3.5), qsec = c(16L, 
17L, 19L, 19L, 17L, 20L), vs = c(0L, 0L, 1L, 1L, 0L, 1L), am = c(1L, 
1L, 1L, 0L, 0L, 0L), gear = c(4L, 4L, 4L, 3L, 3L, 3L), carb = c(4L, 
4L, 1L, 1L, 2L, 1L)), class = "data.frame", row.names = c("Mazda RX4", 
"Mazda RX4 Wag", "Datsun 710", "Hornet 4 Drive", "Hornet Sportabout", 
"Valiant"))
1 голос
/ 16 июня 2020

Если у вас есть только несколько столбцов для этого, вы можете просто использовать ifelse с временным логическим столбцом.

mtcars %>% 
  mutate(newcol = mpg > 20 & cyl == 6, disp = ifelse(newcol, NA, disp), 
         hp = ifelse(newcol, NA, hp),  drat = ifelse(newcol, NA, drat)) %>%
  select(-newcol)
#>     mpg cyl  disp  hp drat    wt  qsec vs am gear carb
#> 1  21.0   6    NA  NA   NA 2.620 16.46  0  1    4    4
#> 2  21.0   6    NA  NA   NA 2.875 17.02  0  1    4    4
#> 3  22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
#> 4  21.4   6    NA  NA   NA 3.215 19.44  1  0    3    1
#> 5  18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
#> 6  18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
#> 7  14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
#> 8  24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
#> 9  22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
#> 10 19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
#> 11 17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
#> 12 16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3
... etc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...