28750


データクレンジングの途中で  
`Error: Can not automatically convert from character to integer in column
"hoge".`

というエラーが出るので、dplyrを用いてデータフレーム内の型を統一（=全てのカラムをcharacterではなくnumericに変換）したいのですが、

<https://stackoverflow.com/questions/34123199/using-mutate-each-from-dplyr-to-
convert-all-numeric-varaibles-to-factor>

を参考に

`iris %>% mutate_each(funs(as.numeric),sapply(df,is.numeric))`

を利用したいのですが、このコードの`is.numeric`を否定にして（＝数値でない時applyしたい）うまく動かしたいです。  
わかる方よろしくお願い致します。

**追記**  
<http://qiita.com/ytakeda/items/b996d93b33803409efb3>を使うこともできますが、パイプで連続処理したいです。  
また、`mutate_each(funs(as.numeric), which(sapply(.,
is.character)))`で今回はエラー回避することが出来ました。


CC BY-SA 3.0
2016-09-07T08:23:54.693
28739
2018-03-04T07:10:17.520
2018-03-04T07:10:17.520
12457
12457
question
r dplyr tidyverse
dplyrを用いてデータフレーム内の型を統一したい


`data.table`を使うことができると思います。

[code]

    library(data.table)
    #test data
    DT <- 
      data.frame(a = c("1", "2", "3"),
                 b = 4:6,
                 c = as.factor(7:9),
                 stringsAsFactors = FALSE)
    
    setDT(DT)
    
    char.col <- which(sapply(DT, is.character))
    DT[ , (char.col) := lapply(.SD, as.numeric),
        .SDcols = (char.col)]
    # DT
    #    a b c
    # 1: 1 4 7
    # 2: 2 5 8
    # 3: 3 6 9
    
[/code]


CC BY-SA 3.0
2016-09-07T15:46:22.927
28748
2016-10-13T10:19:25.070
2016-10-13T10:19:25.070
15185
18598
28739
answer


`mutate_if`や`muatate_at`関数を利用して、対象のデータ型あるいは変数を指定できます。

例のirisデータセットの数値が  
あらかじめ数値型としてセットされているので、一旦文字列型に変更しています

[code]

    str(iris)
    'data.frame':   150 obs. of  5 variables:
     $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
     $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
     $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
     $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
     $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
    
    # 数値型の変数を全て文字列型に変換
    my.iris <- iris %>% mutate_if(is.numeric, as.character)
    str(my.iris)
    'data.frame':   150 obs. of  5 variables:
     $ Sepal.Length: chr  "5.1" "4.9" "4.7" "4.6" ...
     $ Sepal.Width : chr  "3.5" "3" "3.2" "3.1" ...
     $ Petal.Length: chr  "1.4" "1.4" "1.3" "1.5" ...
     $ Petal.Width : chr  "0.2" "0.2" "0.2" "0.2" ...
     $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
    
    # Species列を除いた全ての変数を数値型に変換
    my.iris %>% mutate_at(vars(-Species), as.numeric) %>% str()
     'data.frame':  150 obs. of  5 variables:
     $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
     $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
     $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
     $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
     $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
    
[/code]


CC BY-SA 3.0
2016-09-07T22:24:59.293
28750
2016-09-07T22:24:59.293
6020
28739
answer


`dplyr`パッケージの`mutate_if()`には直で否定演算子を入れる事はできませんが、`function(col)`を用いることで、`FALSE`なカラムのみに関数を適応、を簡潔に実現できます。

[code]

    test <- iris %>% mutate_if(function(col) !is.numeric(col), as.numeric)
    
    head(test, n=2) 
    #   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
    # 1          5.1         3.5          1.4         0.2       1
    # 2          4.9         3.0          1.4         0.2       1
    
[/code]

`iris`の`Species`は`factor`なので数値化されますが、`character`な文字データですと当然`NA`を返します。


CC BY-SA 3.0
2016-09-11T11:32:13.393
28822
2016-09-11T11:32:13.393
15653
28739
answer