Dplyr нестандартная оценка - требуется помощь - PullRequest
0 голосов
/ 10 сентября 2018

Я делаю свои первые шаги ребенка с нестандартной оценкой (NSE) в dplyr.Рассмотрим следующий фрагмент: он принимает tibble, сортирует его по значениям внутри столбца и заменяет нижние значения nk на «Прочее».

См., Например:

library(dplyr)

df <- cars%>%as_tibble

k <- 3

df2 <- df %>%
arrange(desc(dist))  %>% 
mutate(dist2 = factor(c(dist[1:k],
                rep("Other", n() - k)),
                levels = c(dist[1:k], "Other")))

Мне нужна функция, которая:

df2bis<-df %>% sort_keep(old_column, new_column, levels_to_keep)

дает тот же результат, где столбец old_column "dist" (столбец, который я использую для сортировки набора данных), new_column (столбец, который я генерирую)is "dist2" и levels_to_keep "k" (количество значений, которые я явно сохраняю).Я заблудился в enquo, quo_name и т.д ...

Любые предложения приветствуются.

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

Вы можете сделать:

library(dplyr)

sort_keep=function(df,old_column, new_column, levels_to_keep){
  old_column = enquo(old_column)
  new_column = as.character(substitute(new_column))
  df %>%
    arrange(desc(!!old_column))  %>% 
    mutate(use = !!old_column,
           !!new_column := factor(c(use[1:levels_to_keep],
                                  rep("Other", n() - levels_to_keep)),
                                levels = c(use[1:levels_to_keep], "Other")),
           use=NULL)
}


 df%>%sort_keep(dist,dist2,3)
0 голосов
/ 10 сентября 2018

Как то так?

old_column = "dist"
new_column = "dist2"
levels_to_keep = 3

command = "df2bis<-df %>% sort_keep(old_column, new_column, levels_to_keep)"
command = gsub('old_column', old_column, command)
command = gsub('new_column', new_column, command)
command = gsub('levels_to_keep', levels_to_keep, command)
eval(parse(text=command))
...