R 如果使用case_,则对两个或多个列进行变异

R 如果使用case_,则对两个或多个列进行变异,r,dplyr,R,Dplyr,我正在尝试对data.frame中的一组列使用case\u when函数 本例不返回mutate cars %>% mutate ( km = speed * dist, mt = km / 1000 ) %>% mutate ( .funs = case_when( (speed < 20 ) ~ { km = km * 2 mt = mt * 3 } ) ) cars%>%变异( 公里=速度*距离, mt=km/1

我正在尝试对data.frame中的一组列使用
case\u when
函数

本例不返回
mutate

cars %>% mutate (
  km = speed * dist,
  mt = km / 1000
) %>%
mutate (
  .funs = case_when(
    (speed < 20 ) ~ {
      km = km * 2 
      mt = mt * 3
    }
  )
)
cars%>%变异(
公里=速度*距离,
mt=km/1000
) %>%
变异(
.funs=case_时(
(速度<20)~{
公里=公里*2
mt=mt*3
}
)
)

谢谢

我们可以在

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

发现这个解决方案,但有点奇怪和棘手

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
    )
  )

我已经编辑了这个例子。变异的VAR现在是
km=km*2
mt=mt*3
@CaptainTyler是否存在任何其他条件?目标是基于某些行条件变异多于一列(现有或新)
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