Режим расчета для каждого столбца в фрейме данных, используя lapply dplyr - PullRequest
0 голосов
/ 30 августа 2018

Я пытаюсь создать функцию, которая, по сути, возвращает мне РЕЖИМ ... или РЕЖИМ-Х (2-е наиболее распространенное значение & и соответствующие значения для каждого столбца в кадре данных.

Я не могу понять, чего мне не хватает, и мне нужна помощь? Я считаю, что это связано с передачей переменной в функцию dplyr.

library(tidyverse)


myfunct_get_mode = function(x, rank=1){

  mytable = dplyr::count(rlang::sym(x), sort = TRUE)
  names(mytable)= c('variable','counts')
  # return just the rank specified...such as mode or mode -1, etc
  result = table %>% dplyr::slice(rlang::sym(rank))
  return(result)
}

mtcars %>% lapply(. %>% (function(x) myfunct_get_mode(x, rank=2)))

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

Есть некоторые проблемы с вашей функцией:

  1. Вы вызываете функцию, а не делаете то, что думаете. С помощью mtcars %>% lapply(. %>% (function(x) print(x))) проверьте, что на самом деле x - это весь столбец mtcars. Чтобы получить имена столбцов, примените функцию к names(mtcars). Но тогда вы также должны указать фрейм данных, над которым вы работаете.
  2. Чтобы оценить символ, который вы получаете sym, вам нужно использовать !! перед rlang::sym(x).
  3. rank не является именем переменной, поэтому здесь rlang::sym не требуется.
  4. table должно быть mytable в секундах до последней строки вашей функции.

Так как это может работать (хотя, возможно, есть и лучшие способы):

myfunct_get_mode = function(df, x, rank=1){

  mytable = count(df, !!rlang::sym(x), sort = TRUE)
  names(mytable)= c('variable','counts')
  # return just the rank specified...such as mode or mode -1, etc
  result = mytable %>% slice(rank)
  return(result)
}

names(mtcars) %>% lapply(function(x) myfunct_get_mode(mtcars, x, rank=2))
0 голосов
/ 30 августа 2018

Если нам нужно это в list, мы можем использовать map

f1 <- function(dat, rank = 1) {
        purrr::imap(dat, ~
                         dat %>%
                            count(!! rlang::sym(.y)) %>%
                            rename_all(~ c('variable', 'counts')) %>%
                            arrange(desc(counts)) %>%
                            slice(seq_len(rank))) #%>%
        #bind_cols - convert to a data.frame

}

f1(mtcars, 2)
...