如何在R中创建一个函数,在给定 Dataframe 作为输入的情况下对所需数量的向量进行操作?

ruarlubt  于 2023-02-06  发布在  其他
关注(0)|答案(2)|浏览(112)

我正在尝试创建自己的函数来计算 Dataframe 中任意变量(列)的变异系数。

coeffvar <- function(variable)
  { 
  abs((SD(variable) / mean(variable))*100)
  }

它适用于单个向量,但当参数是 Dataframe 时,我得到以下错误:

Warning message:
In mean.default(variable) :
  argument is not numeric or logical: returning NA

且所有输出均为NA

xtupzzrd

xtupzzrd1#

你可以把你的函数 Package 在一个循环中,循环遍历colnames(df),或者你可以尝试类似于这里分享的实现:Apply function to each column in a data frame observing each columns existing data type

coeffvar = function(variable)
  { 
  abs((sd(variable) / mean(variable))*100)
  }

coeffvarS = function(df){
  sapply(df, function(x) coeffvar(x) )
}

coeffvarS(mtcars)

#Output:
    mpg       cyl      disp        hp      drat        wt      qsec        vs 
 29.99881  28.86338  53.71779  46.74077  14.86638  30.41285  10.01159 115.20369 
       am      gear      carb 
122.82853  20.00825  57.42933

如果你想用一个函数同时处理vectors和data.frames,你可以添加一个if语句来检查函数输入的数据类型。

xfb7svmp

xfb7svmp2#

请检查下面的代码,其中map_if仅对数字列有效

coeffvar <- function(variable){
do.call(cbind, map_if(variable, is.numeric, ~ abs(sd(.x)/mean(.x))*100)) %>% 
  as_tibble() %>% unnest(cols = everything())
}

coeffvar(mtcars)

创建于2023年2月3日,使用reprex v2.0.2

# A tibble: 1 × 11
    mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1  30.0  28.9  53.7  46.7  14.9  30.4  10.0  115.  123.  20.0  57.4

相关问题