2017-08-29 2 views
0

複数の異なるデータ型(数値、文字、タイムスタンプ)で構成されるデータフレームを処理していますが、残念ながらそれらのすべてが文字として受け取られます。したがって、私はそれらを「適切な」フォーマットに動的に、そして可能な限り効率的に強制する必要があります。データフレームの変数を適切な形式に変換する

は、次の例を考えてみましょう:

df <- data.frame("val1" = c("1","2","3","4"), "val2" = c("A", "B", "C", "D"), stringsAsFactors = FALSE) 

私は明らかにval1が文字として残る数値とval2になりたいです。したがって、私の結果は次のようになります。

'data.frame': 4 obs. of 2 variables: 
$ val1: num 1 2 3 4 
$ val2: chr "A" "B" "C" "D" 

は、今私は強制がNULLにつながるかどうかをチェックすることでこれを達成して、そうでない場合強制変換で進行しています:

res <- as.data.frame(lapply(df, function(x){ 

    x <- sapply(x, function(y) { 
    if (is.na(as.numeric(y))) { 
     return(y) 
    } else { 
     y <- as.numeric(y) 
     return(y) 
    }  
    }) 

    return(x) 

}), stringsAsFactors = FALSE) 

  1. が、私はこの
  2. を達成するためのより高速な方法があることを疑う:

    しかし、これは複数の問題の正解として私に当たりません他のデータ型を処理するとき、私は警告In FUN(X[[i]], ...) : NAs introduced by coercionを受け取る何らかの理由

  3. 、これはそうではありませんが、(結果を参照)
  4. これは不適切と思われる、すなわち

を日付に一般的な、ヒューリスティックなアプローチがありますこれ、または別の、より持続可能な解決策?ありがとう

+0

'data.frame(lapply(DF、type.convert))' ** OR ** 'ライブラリ(readr)。 data.frame(lapply(df、function(x)parse_guess(x))) 'は動作するかもしれませんが、私は確信していません –

答えて

2

最新のファイルリーダーdata.table::freadreadrパッケージは、列を識別し、適切な種類に変換するのにかなりうまく機能します。

私の最初の反応は、データをファイルに書き込んで再度読み込むことでした。、

library(data.table) 
fwrite(df, "dummy.csv") 
df_new <- fread("dummy.csv") 
str(df_new) 
Classes ‘data.table’ and 'data.frame': 4 obs. of 2 variables: 
$ val1: int 1 2 3 4 
$ val2: chr "A" "B" "C" "D" 
- attr(*, ".internal.selfref")=<externalptr> 

または実際にディスクへの書き込みなし:

df_new <- fread(paste(capture.output(fwrite(df, "")), collapse = "\n")) 

はしかし、d.b's suggestionsはあまり賢くですが、考慮に強制を避けるために、いくつかの研磨を必要とする:

df[] <- lapply(df, type.convert, as.is = TRUE) 
str(df) 
'data.frame': 4 obs. of 2 variables: 
$ val1: int 1 2 3 4 
$ val2: chr "A" "B" "C" "D" 

又は

df[] <- lapply(df, readr::parse_guess) 
+0

この例では有効な解決策ですが、私の実際のデータセットで。私はネスティングの深いレベルのために疑う。 –

0

dataPreparationパッケージをチェックする必要があります。関数findAndTransformNumericsは、あなたが望むものとまったく同じように機能します。

require(dataPreparation) 
data("messy_adult") 
sapply(messy_adult[, .(num1, num2, mail)], class) 
    num1  num2  mail 
"character" "character" "factor" 

messy_adultは、このパッケージの機能を説明するための醜いデータセットです。ここでNUM1とNUM2は文字列です:/

messy_adult <- findAndTransformNumerics(messy_adult) 
[1] "findAndTransformNumerics: It took me 0.18s to identify 3 numerics column(s), i will set them as numerics" 
[1] "setColAsNumeric: I will set some columns as numeric" 
[1] "setColAsNumeric: I am doing the columnnum1" 
[1] "setColAsNumeric: 0 NA have been created due to transformation to numeric." 
[1] "setColAsNumeric: I will set some columns as numeric" 
[1] "setColAsNumeric: I am doing the columnnum2" 
[1] "setColAsNumeric: 0 NA have been created due to transformation to numeric." 
[1] "setColAsNumeric: I am doing the columnnum3" 
[1] "setColAsNumeric: 0 NA have been created due to transformation to numeric." 
[1] "findAndTransformNumerics: It took me 0.09s to transform 3 column(s) to a numeric format." 

ここでは、検索を実行し、それはそれは

見つけたものログインして知っている:

sapply(messy_adult[, .(num1, num2, mail)], class) 
    num1  num2  mail 
"numeric" "numeric" "factor" 

はそれが役に立てば幸い!

Disclamer:私はこのパッケージの作者です。

関連する問題