我的原始数据集有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
答案 0 :(得分:1)
问题出在引号上。 var
和name
是变量。但是当你调用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
的所有列均未命名为var
或name
。
有两种可能的解决方案
将列的名称作为字符串传递:
boxplotlabel <- function (data, var, name) {
datvar <- data[[var]]
namevar <- data[[name]]
boxplot.with.outlier.label(datvar, namevar)
}
boxplotlabel(df, "x", "z")
获取函数中参数的对象名称:
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")
}