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
。此功能有什么问题?
答案 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"))