1

私の元のデータセットには62個の変数があります。c(3:56)関数をループさせたい変数についてboxplot.with.outlier.labelは、を参照してください。

source( "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

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

したがって、次の変数を使用している場合x

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

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

存在しない列にアクセスしようとしています。これによりエラーが発生します。の列にdfは、varまたは。という名前はありませんname

2つの可能な解決策があります

  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 に答える