質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
R

R言語は、「S言語」をオープンソースとして実装なおした、統計解析向けのプログラミング言語です。 計算がとても速くグラフィックも充実しているため、数値計算に向いています。 文法的には、統計解析部分はS言語を参考にしており、データ処理部分はSchemeの影響を受けています。 世界中の専門家が開発に関わり、日々新しい手法やアルゴリズムが追加されています。

Q&A

解決済

1回答

10027閲覧

列中のNAを0に変換したい

AAKN

総合スコア1

R

R言語は、「S言語」をオープンソースとして実装なおした、統計解析向けのプログラミング言語です。 計算がとても速くグラフィックも充実しているため、数値計算に向いています。 文法的には、統計解析部分はS言語を参考にしており、データ処理部分はSchemeの影響を受けています。 世界中の専門家が開発に関わり、日々新しい手法やアルゴリズムが追加されています。

0グッド

0クリップ

投稿2020/04/24 06:16

前提・実現したいこと

Rの超初心者です。
データフレーム内のある列(数値が入っている)の欠損値(#NA)を0に変換したいのですが、シンプルなはずなのに、うまくいきません。どうすれば、変換できるでしょうか。

おそらく、大変初歩的なことなのだと思いますが在宅ワークのため質問できる方がおらず、こちらにて質問させていただきました。

どうぞよろしくお願いいたします。

発生している問題・エラーメッセージ

エラーメッセージ ifelse(is.na(data.selected), 0, data.selected)について エラーは出ませんが、数値が別の数値に変わってしまいました。#NAは1になったように見受けられました。 replace(data.selected, which(is.na(data.selected)), 0)については以下のメッセージが出ます。 警告メッセージ: `[<-.factor`(`*tmp*`, list, value = 0) で: 不正な因子水準です。NA が発生しました data.selected[is.na(data.selected)] <- 0については以下のメッセージが出ます。 警告メッセージ: `[<-.factor`(`*tmp*`, is.na(data.selected), value = 0) で: invalid factor level, NA generated data.selected[which(is.na(data.selected))] <- 0については以下のメッセージが出ます。 警告メッセージ: `[<-.factor`(`*tmp*`, which(is.na(data.selected)), value = 0) で: invalid factor level, NA generated na.omit(data.selected)についてはエラーは出ませんが、#NAは除去されませんでした。

該当のソースコード

#preparation data<- read.csv("20190309-1018-Org-ID1.csv", header=T)#input data options(digits=2) #change digit #Salesの列だけ抽出したい #extraction based on columnList columnList <- c("Sales") #make columnList data.selected <- data[, columnList] #access data #列中の欠損値を0に置換したい ifelse(is.na(data.selected), 0, data.selected) #or replace(data.selected, which(is.na(data.selected)), 0) #or data.selected[is.na(data.selected)] <- 0 #or data.selected[which(is.na(data.selected))] <- 0 #or na.omit(data.selected)

試したこと

ネット上にある、欠損値変換の方法について述べたページを検索し、そこに載っていたコードをすべて試してみました。

また、一度だけ、あるサイトにあった以下のコードがうまくいったことがあったのですが、後日そのコードを動かそうとしたら動きませんでした。

data %>% mutate_all(funs(ifelse(is.infinite(.),0,.))) %>%
mutate_all(funs(ifelse(is.nan(.),0,.))) %>%
mutate_all(funs(ifelse(is.na(.),0,.)))

このコードについては理解できていません。
そのサイトで述べられていた要点は、
欠損値を0にできないエラーはデータフレーム(?)中の型の違いに起因するのかもしれない、
ということだったと思います。

補足情報(FW/ツールのバージョンなど)

RStudio
Version 1.2.5042

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

これで行けると思います。Rでの演算は単値ではなくベクトルが基本、データフレームも究極的にはベクトルを変形したものなので、こういうことになります。

data[is.na(data)] <- 0

投稿2020/04/24 06:32

KojiDoi

総合スコア13692

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

AAKN

2020/04/24 06:48

さっそく回答してくださりありがとうございます。 data[is.na(data)] <- 0 再度試してみましたが、 `[<-.factor`(`*tmp*`, is.na(data.selected), value = 0) で: invalid factor level, NA generated というエラーが出てしまいました。 何か根本的に私が間違ってしまっている可能性はありますでしょうか。
KojiDoi

2020/04/24 07:01

str(data.selected) の結果はどうなりますか?
AAKN

2020/04/24 07:06

Factor w/ 73 levels "#N/A","1008",..: 72 63 1 15 1 12 1 26 1 28 ... となりました。
KojiDoi

2020/04/24 07:22

ちょっと状況を読み違えていましたかね。追求すべきは、「データフレームに含まれるNAを別の値に変える方法」ではなく、「データフレームの操作によって意図せざるNAが発生するのを回避する方法」ですね。 Rにはファクター(因子)という奇怪な型があり、これを文字列と思い込んで処理しようとするといろいろ変なことが起こります。 そして、CSVデータを読み込むときにread.csv, read.tableを遣うと、デフォルトでは文字列データは否応なしにファクターにされてしまいます。 大抵の場合は次のようにしたほうが幸せになれるでしょう。 data<- read.csv("20190309-1018-Org-ID1.csv", header=T, stringsAsFactors = F) あるいは、data$Sales <- as.character(data$Sales) のように後から列ごとに変換する方法もあります。 こう云う処理をしたあとであれば「不正な因子水準です。NA が発生しました」などと文句を言われなくなるはずです。また、あとからNAを適当な値に置き換えることも問題なくできるはずです。 なお、こういうトラブルのときはエラーメッセージを丸ごと検索窓につっこんでググるといいです。
AAKN

2020/04/24 08:00

教えてくださり誠にありがとうございます。 データフレームの操作によって意図せざるNAが発生している状況、だったのですね。 わかっておりませんでした。 さっそく、 data<- read.csv("20190309-1018-Org-ID1.csv", header=T, stringsAsFactors = F) また、 data$Sales <- as.character(data$Sales) の2通りを試してみました。 そしてそれぞれ、 data.selected[is.na(data.selected)] <- 0 を用いて#NAを0に変換しようとしました。 しかし、エラーは出ないものの#NAは変換されないままでした。 コメントいただいたことをもとに、さらに試してみます。 エラーメッセージの検索の仕方含め、丁寧に教えてくださりありがとうございました。
KojiDoi

2020/04/24 08:45

上記のことをしただけではdata.selectedは以前のままですが、ちゃんと全部データを更新していますか? #NAが見えているということは、そのどこかがまだ出来ていないということです。
AAKN

2020/04/24 08:58

コメントありがとうございます!おかげさまで解決いたしました! Salesの数値が、コンソール上で ” ” 付きになっていたため、数値型に変換することにしたのですが、 そのステップを挟んだらいただいたdata[is.na(data)] <- 0が有効になりました。 ```r #preparation #input data #デフォルトでは文字列データはファクター(因子)型にされてしまうことを防ぐ data<- read.csv("20190309-1018-Org-ID1.csv", header=T, stringsAsFactors = F) #Salesの列だけ抽出したい #extraction based on columnList columnList <- c("Sales") #列名をつくる data.selected <- data[, columnList] #access data #この時点で数値データになっていなかったので、data.selected を実数型に変換 data.selected <- as.numeric(data.selected) #data.selected中の欠損値を0に置換 data.selected[is.na(data.selected)] <- 0 #中身の確認 head(data.selected) ``` でいけました(もしかしたらたまたま解決しただけだったのかもしれませんが、、)。 データの更新についてはできていたつもりでおりますが、もしかしたら、そちらが問題だったのかもしれません。 いずれにせよ、丁寧に教えてくださり、心よりお礼申し上げます。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問