【问题标题】:Aggregate function creates unwanted vector within data frame聚合函数在数据框中创建不需要的向量
【发布时间】:2013-10-05 11:02:45
【问题描述】:

我在函数中创建数据框时遇到了一个奇怪的问题。但是,在 data.frame 之外使用相同的方法可以正常工作!

这是基本函数,我用它来计算数据集的均值、标准差和标准误差:

aggregateX<- function(formula, dataset){
  output<-aggregate(formula, dataset, mean) #calculate mean
  sdev<-aggregate(formula, dataset, sd) #calculate sd
  output$sd<-sdev[length(sdev)] #place sd in same data.frame
  output$se<-output$sd/sqrt(max(as.numeric(dataset$P))) #calculate se
  names(output$sd)<-"sd";names(output$se)<-"se" #attatch correct names
  return(output)
}

该函数有效,但有一种将 data.frame 组合为输出的奇怪方法。第一个变量(均值)的格式正确,但标准差和标准误差都被构造为数据帧第一行中的向量。

即当您在 RStudio 中查看输出时,它看起来像这样:

这无关紧要,但是 ggplot2 在尝试处理这个不寻常的 data.frame 时遇到了一些困难。任何关于如何在没有奇怪向量的情况下形成 data.frame 的建议将不胜感激。

【问题讨论】:

  • 其实问题是你在output$sd&lt;-sdev[length(sdev)]中使用了lengthaggregate 的输出是 data.frame 而不是向量,因此您的索引值为 1。

标签: r function vector dataframe aggregate


【解决方案1】:

我发现的另一个选项也可以。但是,我相信 Ferdinand.kraft 提供的解决方案更简单!

与嵌套向量的聚合函数有关。向函数添加 [,1] 命令似乎可以解决它。见下文。

    aggregateX<- function(formula, dataset){
  output<-aggregate(formula, dataset, mean)
  sdev<-aggregate(formula, dataset, sd)
  output$sd<-sdev[length(sdev)][,1]
  output$se<-output$sd/sqrt(max(as.numeric(dataset$P)))
 # names(output$sd)<-"sd";names(output$se)<-"se" #fix names
  return(output)
}

【讨论】:

    【解决方案2】:

    这可能是:

    aggregateX<- function(formula, dataset){
            aggregate(formula, dataset, function(x){
                   c(mean=mean(x),
                       sdev = sd(x),
     #  output$sd<-sdev[length(sdev)] #place sd in same data.frame
     #  that mades no sense.
     #   the length of a data.frame is the number of columns
                       se=sd(x)/length(x)   #length of a vector makes sense
                       )                               }
            )                     }
    

    【讨论】:

    • 不起作用。您需要c() 而不是list() 来返回多于一列,并且在评估se=sdev/length(x) 时未定义sdev。而且我认为 OP 不想除以length(x)。最后它还缺少}。 :-)
    • 我坦率地承认它没有在没有 dput 或代码构建的数据集的情况下进行测试。我之前可能犯过尝试使用list() 而不是c() 的错误。也许 OP 会告诉我们真正的目标是什么,而不是让读者从不正确的代码中直观地理解意图。
    【解决方案3】:

    这将起作用:

    aggregateX<- function(formula, dataset){
      denom <- sqrt(max(as.numeric(dataset$P)))
      aggregate(formula, dataset, function(x){
        s <- sd(x)
        c(mean=mean(x),sd=s,se=s/denom)
      })
    }
    

    假设dataset 有一个名为P 的列。

    【讨论】:

    • 完美运行。谢谢你费迪南德!
    • 只是为了让阅读本文的其他人清楚:$P 用于作为数据集中的主题数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-17
    • 2020-10-16
    • 2018-11-07
    • 2019-12-08
    • 1970-01-01
    • 1970-01-01
    • 2020-07-15
    相关资源
    最近更新 更多