簡體   English   中英

如何修復我的自定義函數以處理包含非數字變量的數據幀

[英]How do I fix my custom function to work on dataframes that include non-numeric variable

我創建了以下函數,將數字列轉換為比例 -

library(tidyverse)

my_function_2 <- function(data, var, round = 4){
    
    var_expr <- rlang::enquo(var)
    colnm_expr <- paste(rlang::get_expr(var_expr), "pct", sep = "_")
    
    data %>%
        mutate(!! colnm_expr := !!var_expr/sum(!!var_expr)) %>%
        round(round)
    
}

然而,它似乎只有在數據框具有“只有”數值時才有效。 例如,它適用於這樣的事情 -

mtcars %>% 
    count(cyl) %>% 
    my_function_2(var = n)

 cyl  n  n_pct
1   4 11 0.3438
2   6  7 0.2188
3   8 14 0.4375

但是,如果使用具有非數字列的數據框,則會出現錯誤,即使我嘗試在數字列上使用該函數 -

# Sample dataframe
groups <- c("group 1", "group 2", "group 3", "group 4", "group 5")
data   <- c(50000, 60000, 70000, 100000, 80000)
df <- tibble(groups, data)

# Test function on `data` column
df %>% my_function_2(var = data)

當我嘗試上面的代碼時,出現以下錯誤 -

 Error in Math.data.frame(list(groups = c("group 1", "group 2", "group 3",  : 
  non-numeric variable(s) in data frame: groups 

似乎錯誤告訴我數據幀中有非數字變量。 但是我不確定為什么這是一個問題,因為我試圖在作為數字列的“數據”變量上使用該函數。 如何修復此功能?

問題是roundmutate之外。 因此,在mtcars數據中,列都是numeric無關緊要,而在創建的數據集中,“組”是character

round(df$groups)
Error in round(df$groups) : non-numeric argument to mathematical function

我們可以在函數中進行更改以僅round入感興趣的列,即在mutate本身內

my_function_2 <- function(data, var, round = 4){
    
    var_expr <- rlang::enquo(var)
    colnm_expr <- paste(rlang::get_expr(var_expr), "pct", sep = "_")
    
    data %>%
        mutate(!! colnm_expr := !!var_expr/sum(!!var_expr) %>%
                            round(round))
    
    
    }

-測試

df %>%
    my_function_2(var = data)
# A tibble: 5 x 3
  groups    data data_pct
  <chr>    <dbl>    <dbl>
1 group 1  50000    0.139
2 group 2  60000    0.167
3 group 3  70000    0.194
4 group 4 100000    0.278
5 group 5  80000    0.222

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM