使用lappy dplyr计算数据帧中每列的模式

使用lappy dplyr计算数据帧中每列的模式,r,function,dplyr,lapply,R,Function,Dplyr,Lapply,我试图创建一个函数,它从本质上为我获取MODE…或MODE-X(第二个最常见的值&以及数据帧中每列的相关计数) 我不知道我可能遗漏了什么,我正在寻求帮助?我相信这与将变量传入dplyr函数有关 library(tidyverse) myfunct_get_mode = function(x, rank=1){ mytable = dplyr::count(rlang::sym(x), sort = TRUE) names(mytable)= c('variable','counts

我试图创建一个函数,它从本质上为我获取MODE…或MODE-X(第二个最常见的值&以及数据帧中每列的相关计数)

我不知道我可能遗漏了什么,我正在寻求帮助?我相信这与将变量传入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)))

如果我们在
列表
中需要它,我们可以使用
映射

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)
f1%
计数(!!rlang::sym(.y))%>%
重命名所有(~c('variable','counts'))%>%
排列(描述(计数))%>%
切片(序号(秩))#%>%
#bind_cols-转换为data.frame
}
f1(mtcars,2)

您的函数存在一些问题:

  • 您的函数调用并不是按照您的想法进行的。使用
    mtcars%%>%lapply(.%>%(函数(x)打印(x))
    检查您的
    x
    实际上是
    mtcars
    的整列。要获取列的名称,请将函数应用于
    名称(mtcars)
    。但是,您还必须指定正在处理的数据帧
  • 要评估从中获得的符号,您需要使用
    rlang::sym(x)
    前面
  • rank
    不是变量名,因此这里不需要
    rlang::sym
  • 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))