【问题标题】:writing a function to calculate the mean of columns in a dataframe in R编写一个函数来计算R中数据框中列的平均值
【发布时间】:2021-11-22 15:18:20
【问题描述】:

我必须通过编写一个函数然后应用它来计算数据框中列的平均值。我知道使用mean 和apply 很容易做到这一点,但我需要编写自己的函数。我做了很多尝试,但似乎无法做到这一点。以下是我的 3 次尝试。我是 R 的初学者。如果有任何建议,我将不胜感激。

mean_fun<-function(x){
  mean_c[i]= sum(x[1:dim(x)],na.rm=TRUE)/length(x[1:dim(x)])
  return(mean_c[i])
}


mean_fun<-function(x){
  for( i in 1:ncol(x)){
    s=sum(x[1:i],na.rm=TRUE)
    l=dim(x[1:i])
    mean_c=s/l
    return (mean_c)
  }


mean_fun<-function(x){
  x=rbind(x,newrow)
  for(i in 1:ncol(x)){
    x[newbottomrownumber,i]=sum[i]/length[i]}
  return(x[1303,])
}

【问题讨论】:

  • 在 R 中,如果可以矢量化,请不要拖入循环和索引,例如sum(x)/length(x)。永远不要写sum(x[1:dim(x)])

标签: r


【解决方案1】:

假设您的数据框中的所有列都是数字,这里是您的第一个函数的调整,其中 x 是一个向量(mydataframe 中的一列)。

mean_fun<-function(x){
    mean_c= sum(x,na.rm=TRUE)/length(!is.na(x))
    return(mean_c)
}

apply(mydataframe,2,mean_fun)

【讨论】:

  • 非常感谢您的帮助。每列由数字组成,我正在尝试编写一个函数来计算数据框中每列的平均值,然后使用 apply() 应用此函数。所以预期的输出将是例如:510、346、1062,....我尝试了上面的函数修改,但收到了输出:1:dim(x)中的错误:长度为0的参数。您还有其他建议吗还是修改?
  • 好的!看我的更新!我在数据框上检查了它,它给出了 colMeans 给出的确切信息。
  • 这是更好的R成语。如果可以矢量化,请不要拖入循环和索引,例如sum(x)/length(x).
  • 除数应该是sum(!is.na(x))。这样结果是错误的,申请mydataframe &lt;- data.frame(x=c(1, NA))。
【解决方案2】:

这是一个稍微修改您的第二次尝试的示例

mean_fun<-function(x){
    mean_c = numeric(0)
    for( i in 1:ncol(x)){
        s = sum(x[,i], na.rm=TRUE)
        l = length(x[,i][is.na(x[,i]) == FALSE])
        mean_c[i] = s/l
    }
    return (mean_c)
}

用法

mean_fun(mtcars)
# [1]  20.090625   6.187500 230.721875 146.687500   3.596563   3.217250  17.848750   0.437500   0.406250
#[10]   3.687500   2.812500

【讨论】:

    【解决方案3】:

    为什么不使用dplyr?

    您可以使用

    获得 data.frame 中所有列的平均值
    summarise_each(funs(mean))
    

    如果我们将其应用于mtcars

    library(dplyr)
    mtcars %>% summarise_each(funs(mean))
    
    #       mpg    cyl     disp       hp     drat      wt     qsec     vs      am   gear   carb
    #1 20.09062 6.1875 230.7219 146.6875 3.596563 3.21725 17.84875 0.4375 0.40625 3.6875 2.8125
    

    【讨论】:

      猜你喜欢
      • 2018-09-22
      • 2017-12-04
      • 1970-01-01
      • 1970-01-01
      • 2020-04-02
      • 2021-11-25
      • 1970-01-01
      • 2020-12-16
      相关资源
      最近更新 更多