【问题标题】:Calculate mode for each column in dataframe using lapply dplyr使用 lapply dplyr 计算数据框中每一列的模式
【发布时间】:2018-08-30 15:12:08
【问题描述】:

我正在尝试创建一个函数,该函数基本上可以让我获得 MODE...或 MODE-X(第 2-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)))

【问题讨论】:

  • 你的函数在这里抛出一个错误:“只有字符串可以转换为符号”
  • 你需要!!来评估

标签: r function dplyr lapply


【解决方案1】:

你的函数有一些问题:

  1. 您的函数调用没有按照您的想法进行。检查mtcars %>% lapply(. %>% (function(x) print(x))),实际上您的xmtcars 的整列。要获取列的名称,请将该函数应用于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))

【讨论】:

    【解决方案2】:

    如果我们在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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-02
      • 2022-12-20
      • 1970-01-01
      • 2018-09-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多