[英]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
似乎錯誤告訴我數據幀中有非數字變量。 但是我不確定為什么這是一個問題,因為我試圖在作為數字列的“數據”變量上使用該函數。 如何修復此功能?
問題是round
在mutate
之外。 因此,在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.