2017-09-22 16 views
0
num_only <- function(df) { 

for (clm in seq_along(df)) { 
    num_cols <- vector("logical", length = ncol(df)) 
    num_cols[[clm]] <-ifelse(length(grep('[aA-zZ]', df[[clm]])) == 0, TRUE, 
FALSE) 

} 
    return(num_cols) 
} 

上記の関数は、データフレーム内の列に数字のみがあるかどうかを示す論理ベクトルを返すものとします。しかし、それは私が最初の列(おそらく最初の2つ)のためにそれを実行すると、間違った値を返すようだ。 破損した関数/論理ベクトル-r

mydf <- data.frame(new = letters[11:20], 
       a = rnorm(10), 
       b = letters[1:10], 
       c = LETTERS[1:10], 
       d = rnorm(10)) 

私は上記のDFを入力し

は、それがTRUE FALSE TRUE FALSE FALSEの論理ベクトルを返す必要がありますが、私はこれが得る:

num_only(mydf) 
[1] FALSE FALSE FALSE FALSE TRUE 

私が間違っているかわからないんだけど。誰も助けることができますか?

答えて

1

一度に1つの論理値しかテストしないので、ifelseは不要です。また、戻りベクトルはforループの外側に作成する必要があります。
また、同等のものではなく、列がクラスnumericであるかどうかを判断する非常に簡単なR-ishソリューションがあります。たぶんあなたは興味を持っています。

num_only <- function(df) { 
    num_cols <- vector("logical", length = ncol(df)) 
    for (clm in seq_along(df)) { 
     num_cols[[clm]] <-if(length(grep('[A-Za-z]', df[[clm]])) == 0) 
      TRUE 
     else 
      FALSE 
    } 
    return(num_cols) 
} 

num_only2 <- function(df) unname(sapply(df, is.numeric)) 

num_only(mydf) 
#[1] FALSE TRUE FALSE FALSE TRUE 

num_only2(mydf) 
#[1] FALSE TRUE FALSE FALSE TRUE 
+0

これはありがとうございます。あなたの2番目の機能について考えましたが、df列はすべて文字クラスなので、is.numericは動作しないとは思わなかった –

関連する問題