5

私はRを使用していて、答えを探し回っていますが、同様の質問を見ましたが、それは私の特定の問題には機能しませんでした。

私のデータセットNAでは、分析の一部が完了したらプレースホルダーに戻るため、プレースホルダーとして'sを使用しようとしています。したがって、すべての計算をNA'sがないかのように実行できるようにしたいと思います。本当にありません。

これがサンプルデータテーブルに関する私の問題です

ROCA = c(1,3,6,2,1,NA,2,NA,1,NA,4,NA)
ROCA <- data.frame (ROCA=ROCA)       # converting it just because that is the format of my original data

#Now my function
exceedes <- function (L=NULL, R=NULL, na.rm = T)
 {
    if (is.null(L) | is.null(R)) {
        print ("mycols: invalid L,R.")
        return (NULL)               
    }
    test <-(mean(L, na.rm=TRUE)-R*sd(L,na.rm=TRUE))
  test1 <- sapply(L,function(x) if((x)> test){1} else {0})
  return (test1)
}
L=ROCA[,1]
R=.5
ROCA$newcolumn <- exceedes(L,R)
names(ROCA)[names(ROCA)=="newcolumn"]="Exceedes1"

エラーが発生しました:

Error in if ((x) > test) { : missing value where TRUE/FALSE needed 

ご存知のように、sapply関数に問題があります。それらを無視する方法についてNAのアイデアはありますか?na.omit以前の場所にすべての'を正しく挿入できるかどうか試してみNAますが、その方法がわかりません。

4

3 に答える 3

5

すでにベクトル化されているsapplyため、無名関数は必要ありません。>

また、無効なデフォルトの引数値を指定するのは本当に奇妙に思えます。私の推測では、missing関数を使用する代わりに、それを応急修理として使用していると思います。NULL関数がを返すときにキャッチを試みる必要があるため、戻るのではなくエラーをスローすることもお勧めしますNULL

exceedes <- function (L, R, na.rm=TRUE)
{
  if(missing(L) || missing(R)) {
    stop("L and R must be provided")
  }
  test <- mean(L,na.rm=TRUE)-R*sd(L,na.rm=TRUE)
  as.numeric(L > test)
}

ROCA <- data.frame(ROCA=c(1,3,6,2,1,NA,2,NA,1,NA,4,NA))
ROCA$Exceeds1 <- exceedes(ROCA[,1],0.5)
于 2011-06-28T00:42:21.143 に答える
3

このステートメントは奇妙です:

test1 <- sapply(L,function(x) if((x)> test){1} else {0})

試す:

test1 <- ifelse(is.na(L), NA, ifelse(L > test, 1, 0))
于 2011-06-27T23:30:07.123 に答える
2

結果にNA:sが必要ですか?つまり、行を並べますか?

戻るだけでうまくいくようL > testです。また、列の追加も簡略化できます(「Exeedes1」はどこかの変数にあると思います)。

exceedes <- function (L=NULL, R=NULL, na.rm = T)
 {
    if (is.null(L) | is.null(R)) {
        print ("mycols: invalid L,R.")
        return (NULL)               
    }
    test <-(mean(L, na.rm=TRUE)-R*sd(L,na.rm=TRUE))

    L > test
}
L=ROCA[,1]
R=.5
ROCA[["Exceedes1"]] <- exceedes(L,R)
于 2011-06-27T23:55:58.043 に答える