2011-06-27 10 views
5

私はRを使用していますが、回答は検索されていますが、同様の質問が表示されていますが、特定の問題では機能していません。サプリ機能でNAを無視する

私のデータセットでは、NAをプレースホルダとして使用しようとしています。なぜなら、私が分析の一部をしたら戻ってくるからです。私はすべての計算をもしNAが本当にそこになかったら。

皆さんが知っているように
Error in if ((x) > test) { : missing value where TRUE/FALSE needed 

、それはsapply機能と間違って何かです:

は、ここで例のデータテーブル私はエラーを取得しています

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" 

と私の問題です。どのようにそれらを無視するための任意のアイデアNAの?私がNAの前にあった場所をすべて挿入することができたら、私はna.omitを試してみましたが、どうやってそれを行うのか分かりません。

+0

xがNAの場合、NAを返すsapply関数に別のif文を追加するだけではどうですか?また、関数のどこにでも 'browser()'を置くと、次回に実行するときにその場所で一時停止します。 –

+0

お返事ありがとうございます!しかし、私はまだ同じエラーが発生しているので、私はこの権利を行ったかどうかはわかりません。ここで私のコードtest1 < - sapply(L、function(x)if((x)== NA){NA} else if((x)> test){1} else {0} )です。今:if((x)== NA){:見つからない値、TRUE/FALSEが必要な場合 – Tim

+0

'is.na(x)'を使ってチェックする必要があります。 'x == NA'はNAを返す... – Tommy

答えて

3

この文は奇妙です:

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

は試してみてください。その結果におけるS:

test1 <- ifelse(is.na(L), NA, ifelse(L > test, 1, 0)) 
+0

あなたに十分に感謝することはできません。本当に迅速なフィードバックを感謝します! – Tim

+0

ここで別の、しかし関連する質問をもう一度聞くのが適切かどうか分かりません。みんなのおかげで、私は小さな微調整をしたいと思っていました。私のデータの特定の部分には空白がありますが、2つの列に空白がある場合は、5から10までの列の値がNAになるように指定します。私が使用しようとしているコードはこれです。 if文を必ず確認する必要があります。 (a [、5:10])エラー:予期しないシンボルが "a < - if(a [、10]&a [、11] == "" is.na " – Tim

+0

"が制御構造体の場合、おそらくベクトルを返す 'ifelse'が必要です。 –

2

は、あなたがNAたいですか?つまり、行を整列させたいのですか?

ちょうど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) 
5

>は既にベクトル化されているため、何のsapplyの必要性とあなたの匿名関数はありません。

また、無効なデフォルトの引数値を指定するのは本当に奇妙なようです。私の推測では、missing機能を使用する代わりに、それをkludgeとして使用しているということです。 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) 
+0

nullを使用する利点は、明示的に渡すことが常に容易であることです。状況によっては、「欠落」引数を生成することが苦労します。 – hadley

+0

@hadley:私は同意します( 'plot.default'がいくつかの引数を処理する方法です)。しかし、この特定の状況では、' NULL'引数の値が無効です。 –

関連する問題