`dplyr :: case_when`没有给我正确的结果

时间:2019-01-08 22:45:59

标签: r tidyverse

case_when无法产生预期的结果:

我的列表:

library(tidyverse)

1:6%>%
  str_c('var',.)%>%
  map(~assign(.,runif(30,20,100),envir=globalenv()))

tibble<-as_tibble(
  bind_cols(mget(ls(pattern='*v')))
)

cluster<-kmeans(tibble,centers=3)
cluster
tibble$kmeans<-as.factor(cluster[['cluster']])

mylist<-split(tibble,tibble$kmeans)
names(mylist)<-str_c('dataset',seq_along(mylist))

我的代码:

variables<-str_c('var',1:6)

mylist%>%
  map(~mutate_at(.,.vars=vars(variables),
              .funs=funs(.=case_when(
                .%in%c(1:50)~'less',
                .%in%c(51:100)~'more'
              ))))

输出将NAs转换为新变量,而不是lessmore。此功能有什么问题?

2 个答案:

答案 0 :(得分:3)

也许您的意思更像这样:

mylist %>%
  map(~mutate_at(.,.vars=vars(starts_with("var")),
                 .funs=funs(.=case_when(
                   . <= 50 ~ 'less',
                   . > 50 ~ 'more'
                 ))))

但是这仍然很尴尬,变量名不正确,并且实际上没有必要先将其拆分为列表,这使得所有事情都比需要的复杂得多。通常,如果将各组放在一起并重新塑形,事情会更容易处理:

tibble %>%
  gather(key = "var",value = "val",var1:var6) %>%
  mutate(x = case_when(val <= 50 ~ "less",
                       val > 50 ~ "more"))

答案 1 :(得分:1)

也许使用ifelse

cbind(tibble, ifelse(tibble[ , variables] <= 50, "less", "more"))