【问题标题】:`dplyr::case_when` don't give me correct results`dplyr::case_when` 没有给我正确的结果
【发布时间】:2019-01-08 22:45:58
【问题描述】:

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。这个函数有什么问题?

【问题讨论】:

  • str_c, map, assign, as_tibble, bind_cols, mget, ls ... 为什么不使用 base: data.frame(matrix(runif(30 * 6, 20, 100), ncol = 6))

标签: r tidyverse


【解决方案1】:

也许你的意思更像这样:

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

【讨论】:

    【解决方案2】:

    也许使用ifelse:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多