6

R に読み込んだファイルがあり、データフレーム (CA1 と呼ばれる) に変換されて、次のような構造になります。

   Station_ID Guage_Type   Lat   Long     Date Time_Zone Time_Frame H0 H1 H2 H3 H4 H5  H6  H7  H8  H9 H10 H11 H12 H13 H14 H15 H16 H17 H18 H19 H20 H21 H22 H23
 1    4457700         HI 41.52 124.03 19480701         8        LST  0  0  0  0  0  0   0   0   0   0   0   0 MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS
 2    4457700         HI 41.52 124.03 19480705         8        LST  0  1  1  1  1  1   2   2   2   4   5   5   4   7   1   1   0   0  10  13   5   1   1   3
 3    4457700         HI 41.52 124.03 19480706         8        LST  1  1  1  0  1  1   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
 4    4457700         HI 41.52 124.03 19480727         8        LST  3  0  0  0  0  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
 5    4457700         HI 41.52 124.03 19480801         8        LST  0  0  0  0  0  0   0   0   0   0   0   0 MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS
 6    4457700         HI 41.52 124.03 19480817         8        LST  0  0  0  0  0  0 ACC ACC ACC ACC ACC ACC   6   1   0   0   0   0   0   0   0   0   0   0

H0 から H23 は character() として読み込まれます。これは、値が数値ではなく、MIS、ACC、または DEL などの値を持つ場合があるためです。

私の質問: H0 から H23 までの各列の値を数値に型キャストし、文字値 (MIS、ACC、DEL) を NA または NAN として持つ方法はありますか (is.nan またはis.na) その上でいくつかの数値モデルを実行できます。それとも、文字値を -9999 などの識別子に変更するのが最善でしょうか?

私は多くの方法を試しました。このサイトでいくつか見つけましたが、どれも機能しません。そのような:

 for (i in 8:31)
 {
     CA1[6,i] <- as.numeric(as.character(CA1[6,i]))
 }

もちろん警告が表示されますが、2 つの特定の値 is_numeric() (CA1[6,8] と CA1[6,19]) をテストすると、両方に対して false のステートメントが表示されます。最初は理由がわかりませんが、2番目は「」なので理解できます。ただし、それを is.na(CA1[6,19]) でテストして true を返すことができます。これは、数値ではないことがわかっていれば問題ありません。

私が試した2番目の方法は次のとおりです。

 for (i in 8:31)
 {
     CA1[6,i] <- as.numeric(levels(CA1[6,i]))[CA1[6,i]]
 }

以前と同じ結果が得られます。

私がやろうとしていることを効率的に行う方法はありますか?よろしくお願いいたします。ありがとうございました

4

3 に答える 3

6

差し迫った問題は、データフレームの各列に含めることができるのは1つのタイプの値のみであるということです。6コード内のCA1[6,i]inは、各列で1つの値のみが変換されることを意味します。したがって、変換後に挿入される場合は、列の残りの部分と一致するように文字列に強制的に戻す必要があります。

これを解決するには、列全体を一度に変換して、列を完全に置き換えます。つまり、:を削除し6ます

 for (i in 8:31)
 {
     CA1[,i] <- as.numeric(as.character(CA1[,i]))
 }
于 2012-05-04T09:18:11.133 に答える
6

データを読み込むとき、通常は列の型を指定できます。たとえば、read.table/read.csvにはcolClasses引数があります。

# Something like this
read.table('foo.txt', header=TRUE, colClasses=c('integer', 'factor', 'numeric', numeric', 'Date'))

詳細については、を参照?read.tableしてください。

于 2012-05-04T09:13:26.667 に答える
2

トミーの答えに従って、データを読み込むときにこの問題に対処できる可能性があります。とが常に欠損値を表す場合"MIS"、で引数を使用できます。"ACC""DEL"na.stringsread.table

read.table('foo.txt', header=TRUE, na.strings = c("MIS", "ACC", "DEL"))

欠損値を常に示す他の文字列がある場合は、それらを上記のベクトルに追加できます。

ただし、たとえば、"MIS"列に表示されTime_Frame、欠損値を示す以外の意味がある場合は、このアプローチをとらないでください!!

于 2012-05-04T10:27:01.600 に答える