【问题标题】:Function for SummaryBySummaryBy 函数
【发布时间】:2016-07-29 17:16:50
【问题描述】:

我尝试编写一个函数来产生均值和标准差

library(doBy)
fun = function(x){
  mean = mean(x, na.rm = TRUE)
  sd = sd(x, na.rm = TRUE)
  c(mean, sd)
  }

summaryBy(mpg~am, data = mtcars, FUN=fun)

它可以调用summaryBy,但是当我尝试放入函数来调用变量和数据集的名称时,它给了我错误

"list(mpg, am, mtcars) 中的错误:(list) 对象不能被强制输入 'double"

list <- function(x,y,dataset){
  x <- as.numeric(x)
  y <- as.factor(y)
  table <- summaryBy(x~y, data = dataset, FUN=fun)
  table

}

list(mpg, am, mtcars)

感谢您的建议

【问题讨论】:

    标签: r function summary


    【解决方案1】:

    这与summaryBy 无关,这是您的list 函数的代码中的错误。 (顺便说一句,你不应该将函数命名为"list",因为这已经是 R 中一个重要函数的名称,你最终会遇到问题。)试试这个(你需要在引号中输入变量名):

    my.tab <- function(x, y, dataset){
      xn <- with(dataset, as.numeric(get(x)))
      yf <- with(dataset, as.factor(get(y)))
      newdf <- data.frame(xn=xn, yf=yf)
      names(newdf) <- c(x, y)
      table <- summaryBy(as.formula(paste0(x,"~",y)), data=newdf, FUN=fun)
      table
    }
    my.tab("mpg", "am", mtcars)
    #   am mpg.FUN1 mpg.FUN2
    # 1  0 17.14737 3.833966
    # 2  1 24.39231 6.166504
    

    【讨论】:

    • 明白了,还是不明白为什么要把变量名放在引号里
    • @Stat,您没有将变量输入到您的函数中;您正在输入变量的 name。那是一个字符串。然后,您需要 get() 数据集中具有该名称的变量。
    • @Stat:这是因为你的变量名不是全局环境中的变量。
    【解决方案2】:

    问题是当你调用函数list时,mpgam不是全局环境中的变量。做你想做的事,改变函数签名来输入公式并用公式调用函数:

    list <- function(f, dataset){
      return(summaryBy(f, data = dataset, FUN=fun))
    }
    table <- list(as.formula(mpg~am), mtcars)
    print(table)
    ##  am mpg.FUN1 mpg.FUN2
    ##1  0 17.14737 3.833966
    ##2  1 24.39231 6.166504
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-12
      相关资源
      最近更新 更多