1

我的原始数据集有 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

我很感激任何帮助!格瑞特

4

3 回答 3

1

问题在于引号。 var并且name是变量。但是当您调用data[["var"]](带引号)时,您使用的不是变量var而是字符串,该字符串的值是字符“var”。

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

例如:

    # If you want to get this: 
    df$x 

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

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

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

    # Right
    var <- "x"
    df[[var]]
于 2012-11-16T15:26:46.430 回答
1

您正在尝试访问不存在的列。这会产生错误。的列都df没有命名为varor name

有两种可能的解决方案

  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)
    
于 2012-11-16T15:36:59.047 回答
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")
}
于 2012-11-16T19:41:13.370 回答