1.构建函数 - 2.用于循环boxplot.with.outlier.label

时间:2012-11-16 15:04:40

标签: r boxplot

我的原始数据集有62个变量。对于变量c(3:56),我想循环函数boxplot.with.outlier.label,参见

源( “http://www.r-statistics.com/wp-content/uploads/2011/01/boxplot-with-outlier-label-r.txt”)

但我已经坚持构建一个允许我构建循环的函数。这是一些模拟数据(当然不会显示异常值,但据我所知,这不是问题的一部分 - 证明我错了!)

x <- rnorm(1000)
y <- rnorm(1000)
z <- sample(letters, 1000)
df <- as.data.frame(cbind(x,y,z))
df$x<- as.numeric(df$x)
df$y<- as.numeric(df$y)
df$z<- as.character(df$z)

这很好用:

boxplot.with.outlier.label(df$x, df$z)

这不是:

boxplotlabel <- function (data, var, name) {
  datvar <- data[["var"]]
  namevar <- data[["name"]]
  boxplot.with.outlier.label(datvar, namevar)
}
boxplotlabel(df, x, z)
Error in plot.window(xlim = xlim, ylim = ylim, log = log, yaxs = pars$yaxs) :need finite 'ylim' values
In addition: Warning messages:
1: In is.na(x) : is.na() applied to non-(list or vector) of type 'NULL'
2: In is.na(x) : is.na() applied to non-(list or vector) of type 'NULL'
3: In is.na(x) : is.na() applied to non-(list or vector) of type 'NULL'
4: In min(x) : no non-missing arguments to min; returning Inf
5: In max(x) : no non-missing arguments to max; returning -Inf

我哪里错了?或者是否有一种不同的方法来实现函数boxplot.with.outlier.label的所需循环?

我感谢任何帮助! Gerit

3 个答案:

答案 0 :(得分:1)

问题出在引号上。 varname是变量。但是当你调用data[["var"]](带引号)时,你没有使用变量var而是使用字符串,该字符串的值是字符“var”。

如果您删除引号,那么您将在那里。 Var本身应该有一个字符串值。所以请确保将列的 名称 传递给它,而不是列本身。

例如:

    # If you want to get this: 
    df$x 

    df[["x"]]   # right
    df[[x]]     # wrong

因此,如果我们使用x的变量:

    # Wrong
    var <- x
    df[[var]]

    # Right
    var <- "x"
    df[[var]]

答案 1 :(得分:1)

您正在尝试访问不存在的列。这会产生错误。 df的所有列均未命名为varname

有两种可能的解决方案

  1. 将列的名称作为字符串传递:

    boxplotlabel <- function (data, var, name) {
      datvar <- data[[var]]
      namevar <- data[[name]]
      boxplot.with.outlier.label(datvar, namevar)
    }
    
    boxplotlabel(df, "x", "z")
    
  2. 获取函数中参数的对象名称:

    boxplotlabel <- function (data, var, name) {
      datvar <- data[[deparse(substitute(var))]]
      namevar <- data[[deparse(substitute(name))]]
      boxplot.with.outlier.label(datvar, namevar)
    }
    
    boxplotlabel(df, x, z)
    

答案 2 :(得分:0)

这是函数加循环的最后一组。只是为了得到一个完整的答案,以防另一个新手攻击这个问题。你“只是”需要创建异常值。

#fct.
boxplotlabel <- function (data, var, name) {
  datvar <- data[[var]]
  namevar <- data[[name]]
  boxplot.with.outlier.label(datvar, namevar)
}
#single output:
boxplotlabel(df, "x", "z")
#loop:
col <- names(df[,c(1:2)])
for (i in seq_along(col)){
  boxplotlabel(df, col[i], "z")
}