2017-08-28 1 views
0

一部の列にはcharacternumericというデータが混在しているデータがあります。たとえば:複数の列で特定の文字列をNAに変更して列を数値に変更する方法

Sensor Sensor2 Sensor3 
Fail 5   Fail 
Fail 5   Fail 
Fail 5   Fail 
Fail 5   Fail 
5  5   Fail 
6  5   Fail 
8  5   Fail 

すべてのセンサ値はnumericする必要がありますが、Rは、自動的にcharacter値としてセンサー1とSensor3を取ります。 "Fail"をNAまたはいくつかの数値で置き換えるか、Column型全体を数値型に変更して、「Fail」が自動的にNAに変更されます。

私の問題は、私のデータセットが実際には大きかったということです(センサーデータは毎秒生成され、200個以上の変数があります)。私は '失敗'を含むすべての列を識別し、これらの列をnumeric型に変更したいと考えています。

これは私が試したものです:私は

function(mydata, value1, value2){ 
    mydata <- data.frame(lapply(mydata, function(x){    
    gsub(value1, value2 ,x) 
    })) 
} 

を機能を書いたこの機能は動作しますが、唯一の問題は、全体のデータフレームがfactor型に変更されたということです。私はnumericcharacterを混在させて、データ型を正しく保ちたいと思っています。だから私は

function(mydata, value1, value2){ 
    mydata <- data.frame(lapply(mydata, function(x){    
    is.numeric(gsub(value1, value2 ,x)) 
    })) 
    } 

を試してみましたこれはnumericにすべての私のコラムを変更したので、私はすべてのcharacter列情報を逃しました。

「Fail」列のみを識別し、それらの列のみを変更し、そのデータフレームを変更するにはどうすればよいですか?ありがとう。

+1

'read.xyz'関数のいずれかを使用してデータを読み込むと、たとえば、次のようになります。 'read.table'の場合、' na.strings = c( Henrik

+0

関連:[データフレーム内の文字の値をNAに置き換える](https://stackoverflow.com/questions/3357743/replacing-character-values-with-na-in-a-data-frame/3357804#3357804) – Henrik

+0

はい、ヘンリク。私はこの方法を知っています。私は、ユーザーが通常はデータインポートボタンを使ってデータをインポートするため、一連のデータ前処理/クリーニング手順でこのジョブを実行できる自動機能をいくつか書いています。データをインポートした後に、一部のクリーニングジョブが実行されました。どうもありがとう! –

答えて

0

は私が

data <- read.table(text = "Sensor Sensor2 Sensor3 
        Fail 5   Fail 
        Fail 5   Fail 
        Fail 5   Fail 
        Fail 5   Fail 
        5  5   Fail 
        6  5   Fail 
        8  5   Fail", 
        header = TRUE, stringsAsFactors = FALSE) 
data$char <- letters[1:nrow(data)] 

最後の行が数値に変換してはならない追加の列を紹介してサンプルデータを作成します。

私はstringsAsFactors = FALSEを使用して、列が要因ではないことを確認しています。 の前に、の変換を実行する前に、データをチェックインする必要があります。そして

fail_cols <- sapply(data, function(x) any(grepl("Fail", x))) 

、Iは、NA"Fail"を置換し、数値に変換する関数を定義する:

最初のステップは、どこか"Fail"を含む列を同定することである私が使用

to_num <- function(x) { 
    as.numeric(gsub("Fail", NA, x)) 
} 

as.numeric()ではなく、is.numeric()です。前者は数値に変換し、後者は変数の数値であるかどうかをチェックします。

この関数は、今だけ"Fail"を含むデータフレームのこれらの列に適用されます。

data[fail_cols] <- lapply(data[fail_cols], to_num) 
data 
## Sensor Sensor2 Sensor3 char 
## 1  NA  5  NA a 
## 2  NA  5  NA b 
## 3  NA  5  NA c 
## 4  NA  5  NA d 
## 5  5  5  NA e 
## 6  6  5  NA f 
## 7  8  5  NA g 

あなたはすでに、単にas.numeric()代わりのto_num()を使用して同じ結果を与えるだろうと疑問に指摘しました。しかし、警告メッセージを出すという欠点があります。これらを避けるためには、to_num()を定義することはまだ役立つかもしれません。

+0

こんにちは、Stibu、あなたの返信ありがとう、私は本当にそれを感謝します。私はis.numericがちょうどタイプミスだと思う、私はas.numericを持っていた。まず、このステップは私の大規模なデータセットの前処理/クリーニングの一部です。私は以前の結果をテーブルとして保存し、このステップのために再度読み込むことは望ましくありません。そして、私はあなたのソリューションを試しました。あなたのソリューションは自分のソリューションで同じ問題を抱えていると思います。他のすべての文字タイプの列もNAに変更されます。 –

+0

申し訳ありませんが、私は文字のままにする必要がある列についてのポイントを逃しました。残念ながら、あなたのサンプルデータにはそのような列が含まれていませんでした。あなたの次の質問にもっと現実的な例のデータを作成しようとしてください... – Stibu

+0

ありがとう、Stibu。問題が解決しました!感謝します。 –

関連する問題