мутировать два или более столбцов, если используется case_when - PullRequest
0 голосов
/ 16 ноября 2018

Я пытаюсь использовать функцию case_when для набора столбцов ya data.frame.

Этот случай не возвращает указанные столбцы в mutate

cars %>% mutate (
  km = speed * dist,
  mt = km / 1000
) %>%
mutate (
  .funs = case_when(
    (speed < 20 ) ~ {
      km = km * 2 
      mt = mt * 3
    }
  )
)

Спасибо

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Откройте для себя это решение, но оно немного странное и хитрое

mutate_when <- function (data, ...) {
  dots <- eval (substitute (alist(...)))
  for (i in seq (1, length (dots), by = 3)) {
    condition <- eval (dots [[i]], envir = data)
    mutations <- eval (dots [[i + 1]], envir = data [condition, ])
    data[condition, names(mutations)] <- mutations
    mutations_else <- eval (dots [[i + 2]], envir = data [!condition, ])
    data[!condition, names(mutations)] <- mutations_else
  }
  data
}

cars %>%
  mutate(
    km = speed * dist, 
    mt = km/1000
  ) %>%
  mutate_when(
    speed < 20, 
    list (
      km = km * 2,
      mt = mt * 3
    ),
    list (
      0
    )
  )

Дает

   speed dist   km    mt
1      4    2   16 0.024
2      4   10   80 0.120
3      7    4   56 0.084
4      7   22  308 0.462
5      8   16  256 0.384
6      9   10  180 0.270
0 голосов
/ 16 ноября 2018

Мы могли бы использовать mutate_at

library(tidyverse)
cars %>%
   mutate(km = speed * dist, mt = km/1000) %>%
   mutate_at(vars(km, mt), funs(case_when(speed < 20 ~ .*2,
                                      TRUE ~ .)))

Если нам нужно выполнить вычисления с отдельными значениями для каждого столбца, используйте map2 или pmap

out <- cars %>%
         mutate(km = speed * dist, mt = km/1000)  %>%  
         select(km, mt) %>%
         map2_df(., list(2, 3), ~ 
           case_when(cars$speed < 20 ~ .x * .y, TRUE ~ .x)) %>% 
         bind_cols(cars, .)

head(out)
#  speed dist  km    mt
#1     4    2  16 0.024
#2     4   10  80 0.120
#3     7    4  56 0.084
#4     7   22 308 0.462
#5     8   16 256 0.384
#6     9   10 180 0.270
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...