web-dev-qa-db-ja.com

R:data.frameの要素を置き換える方法は?

「#N/A」を含むdata.frameの要素を「NULL」に置き換えようとしています。問題が発生しています。

foo <- data.frame("day"= c(1, 3, 5, 7), "od" = c(0.1, "#N/A", 0.4, 0.8))

indices_of_NAs <- which(foo == "#N/A") 

replace(foo, indices_of_NAs, "NULL")

[<-.data.frame*tmp*、list、value = "NULL")のエラー:新しい列は既存の列の後に穴を残します

問題は、私のインデックスがdata.frameをベクトルとして処理していることですが、replace関数はそれを何らかの形で別の方法で処理していることですが、問題が何であるかわかりませんか?

13
John

NULLは、実際には「欠落」ではなく「何もない」ことを意味するため、実際の値の代わりになることはできません。欠落しているRの場合、NAを使用します。

Is.naの置換メソッドを使用して、選択した要素を直接更新できます。これは論理的な結果で機能します。 (for whichインデックスを使用すると、is.naでのみ機能します。[を直接使用すると、リストアクセスが呼び出されます。これがエラーの原因です)。

foo <- data.frame("day"= c(1, 3, 5, 7), "od" = c(0.1, "#N/A", 0.4, 0.8)) 
NAs <- foo == "#N/A"

## by replace method
is.na(foo)[NAs] <- TRUE

 ## or directly
 foo[NAs] <- NA

しかし、あなたはすでにc()で作成されたときの強制型変換によってod列で文字列(実際にはデフォルトで因子)を処理しており、列を個別に処理する必要があるかもしれません。たとえば、数値列は文字列 "#N/A"に一致することはありません。

19
mdsumner

何故なの

x$col[is.na(x$col)]<-value


データフレームを変更する必要はありません

12
Aashu

Replace関数はベクトルを想定しており、data.frameを提供しています。

現在使用している文字値の代わりに、NANULLを実際に使用する必要があります。そうしないと、Rのすべての機能を利用して欠損値を処理できなくなります。

編集

適用関数を使用するか、次のようなことを行うことができます。

foo <- data.frame(day= c(1, 3, 5, 7), od = c(0.1, NA, 0.4, 0.8))
idx <- which(is.na(foo), arr.ind=TRUE)
foo[idx[1], idx[2]] <- "NULL"

この場合、長さがゼロであるため、実際のNULL値を割り当てることはできません。 NANULLの違いを理解することが重要であるため、?NA?NULLを読むことをお勧めします。

1
Shane