代码之家  ›  专栏  ›  技术社区  ›  Mark

在所有dplyr结构中使用的函数中访问列名

  •  0
  • Mark  · 技术社区  · 5 年前

    我在建一个 dplyr 结构在一个代码块中的数据帧列上运行一些自定义函数

    当前我的函数如下所示

     funx <- function(x) {
    
      logchoice <- if(max(x) < 400) {'T' } else { 'F' }
      logtest <- suppressWarnings(log10(x))
      remaining <- length(logtest[which(!is.na(logtest) & is.finite(logtest))])
      x <- if(remaining > 0.75*length(x)) {suppressWarnings(log10(x)) } else { x }
      x <- x[which(!is.na(x) & is.finite(x))]
      y <- diptest::dip.test(x)
      z <- tibble(pvalue = y$p.value, Transform = logchoice)
    
      return(z)
      }
    

    以及 dplyr公司 结构如下所示:

    mtcars %>% 
     sample_n(30) %>%
     select(colnames(mtcars)[2:5]) %>%
     summarise_all(list(~ list(funx(.)))) %>% 
     gather %>% 
     unnest %>% 
     arrange(pvalue) %>% 
     rename(Parameter = key)
    

    这给了我:

      Parameter     pvalue Transform
    1       cyl 0.00000000         T
    2      drat 0.03026093         T
    3        hp 0.04252001         T
    4      disp 0.06050505         F
    

    我想知道如何在我的函数中访问列名,主要是因为我想将结果表中的名称更改为如下的输出: paste(original_column_name, 'log10', sep = '')

    因此,预期输出为:

       Parameter     pvalue Transform
    1  log10_cyl 0.00000000         T
    2 log10_drat 0.03026093         T
    3   log10_hp 0.04252001         T
    4       disp 0.06050505         F
    
    0 回复  |  直到 5 年前
        1
  •  0
  •   yake84    5 年前

    你很接近。你可以加一个 mutate()

    mtcars %>% 
      sample_n(30) %>%
      select(colnames(mtcars)[2:5]) %>%
      summarise_all(list(~ list(funx(.)))) %>% 
      gather() %>% 
      unnest() %>% 
      arrange(pvalue) %>% 
      rename(Parameter = key) %>% 
      mutate(Parameter = ifelse(Transform == "T", paste0("log10_", Parameter), Parameter)) %>% 
      select(Parameter, pvalue)
    
    #  Parameter     pvalue
    #  log10_cyl 0.00000000
    # log10_drat 0.01389723
    #       disp 0.02771770
    #   log10_hp 0.08493466
    
        2
  •  0
  •   yake84    5 年前

    回答在一个单独的职位,因为解决方案是不同的。获取 print() purrr::map_dfr 构建结果的数据帧。我做的小改动是为了抓住列名, col_name ,并指定数据帧。我尝试了一些方法来获取列名使用您原来的功能,但结果不成功。

    logtest_pval <- function(col, df) {
    
      col_name <- col
      x <- df %>% pull(!!col)
    
      logchoice <- ifelse(max(x) < 400, TRUE, FALSE)
      logtest <- log10(x)
      remaining <- length(logtest[which(!is.na(logtest) & is.finite(logtest))])
    
      x <- if(remaining > 0.75*length(x)) {suppressWarnings(log10(x)) } else { x }
      x <- x[which(!is.na(x) & is.finite(x))]
      y <- diptest::dip.test(x)
    
      z <- 
        tibble(
          transform = logchoice,
          column = ifelse(logchoice, paste0("log10_", col_name), col_name),
          pvalue = y$p.value
        )
    
      print(paste0(z, collapse = " | "))
      return(z)
    }
    

    然后可以构建数据帧:

    purrr::map_dfr(
      .x = names(mtcars), # the columns to use
      .f = logtest_pval,  # the function to use
      df = mtcars         # additional arguments needed
    )
    

    df <-
      mtcars %>% 
      select_if(is.numeric)
    
    pvalues <-
      map_dfr(names(df), logtest_pval, df)