`dplyr :: case_when` не дает правильных результатов - PullRequest
0 голосов
/ 09 января 2019

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 в новые переменные, а не less или more. Что не так с этой функцией?

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Может использовать ifelse:

cbind(tibble, ifelse(tibble[ , variables] <= 50, "less", "more"))
0 голосов
/ 09 января 2019

Может быть, вы имели в виду что-то вроде этого:

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"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...