【问题标题】:Apply function to every column in data frame operating on names将函数应用于对名称进行操作的数据框中的每一列
【发布时间】:2013-03-25 23:45:43
【问题描述】:

我正在尝试编写一些将采用数据框并绘制每个数字列的东西,其中包含用于非正态分布的简单图和用于正态分布的控制图:

library(plyr)
library(qcc)
library(ggplot2)

#generate data frame
data <- data.frame(seq_len(10),LETTERS[seq_len(10)],rnorm(10,5,3),rep(1,10),rep(2,10),rnorm(10,3,1),runif(10))

##checks heterogeneity
has_range <- function(data) { if(all( abs(data - mean(data)) == 0)) FALSE else TRUE}

##test for normality
normtest <- function(data) {if(has_range(data) == FALSE) FALSE else {
  if(shapiro.test(data)$p.value < 0.05) FALSE else TRUE}}

##Control charts for Normal data, simple plots otherwise
drawplot<-function(data, ref=NULL) {
  Sys.sleep(.1)
  print(names(data))
  if(normtest(data) == FALSE) {
    plot(x=ref, y=data, ylab=names(data))
  } else {
    qcc(data,type="xbar.one", labels=ref, ylab=names(data))  
  }
}

## Apply drawplot to all numeric columns in data frame
colwise(drawplot, is.numeric, ref=data[[2]])(data)

问题是每个应用族函数似乎都去掉了列名,我不能使用列名来标记图:

print(names(data))

给出 NULL 结果。

还有一个看似无关的错误正在突然出现:

Error: length(rows) == 1 is not TRUE

【问题讨论】:

    标签: r plyr apply


    【解决方案1】:

    您需要创建一个使用名称的函数,否则函数内将无法访问名称。

    你不能将x = NULL 传递给plot,所以我重写了一些你的函数 (qcc 也在用原子向量为x 大惊小怪)

    类似

    drawplot<-function(n, data, ref=NULL) {
      Sys.sleep(.1)
      print(n)
    
    
      if(normtest(data[[n]]) == FALSE) {
        if(is.null(ref)){ref <- seq_along(data[[n]])}
        plot(x=ref, y=data[[n]], ylab=n)
      } else {
        qcc(data[,n, drop=FALSE], type="xbar.one", labels=ref,ylab = n)  
      }
    }
    
    lapply(names(Filter(is.numeric,dd)), drawplot, data = dd)
    

    请注意,此函数也适用于位置索引(但标签不会那么漂亮)

    【讨论】:

    • 谢谢 mnel,这似乎有效。只是对任何复制的人的说明,您必须在此修改中将您创建的原始数据框命名为“dd”。现在我要美化图表,看看是否可以使用 ggplot2 代替绘图。另外,最好有一个基于 ggplot2 的 qcc 包。
    • @variable -- 是的,我重命名了。我不喜欢data作为变量名,因为有一个函数data
    猜你喜欢
    • 1970-01-01
    • 2022-12-13
    • 1970-01-01
    • 2021-08-03
    • 2023-03-17
    • 2017-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多