2017-03-29 18 views
1

数値以外の値を持つすべてのセルをデータなし(NA)に変換しようとしています。データフレーム内の非数値セルをすべてNAに変換する方法

recode_missing <- function (g, misval) 
{ 
    a <- g == misval 
    temp = g 
    temp [a] <- NA 
    return (temp) 
} 

素晴らしい作品:エレガントR液Iは次のように、不足しているデータに特定の値を変換するの線に沿って同様のものを試してみました。

Iはa <- g == is.numeric()(構文的に間違っている)、a <- is.numeric (g): (Error: (list) object cannot be coerced to type 'double'), or even [、] <ように復号することを試みた - 列

remove_nn <- function (data) 
{ 
    # removes all non-numeric columns 
    numeric_columns <- sapply (data, is.numeric) 
    return (data [, numeric_columns]) 
} ### remove_nn ### 
を除去する溶液のI認識is.numeric(G [、] `(同じ)。

しかし、それは、列を削除し、いくつかの行列にデータフレームを変換します。

誰かがそのままデータ構造を残したままNAに単一の非数値セルを変換する方法について助言してくださいもらえますか?

編集

コメントが正確に指摘しているように、数値の海には個々の文字列値などはありません。数字やその他のものだけのベクトル。 medians <- apply (data, 2, median)の非数値エラーの原因を知りたかったのです。私は多くのベクトルを持っており、目視検査は役に立たないことが判明しました。私はnum <- sapply (data, is.numeric)と次のdata [,!num]を発行しました。それは私に非数字の列を与えました。 「余分を含む1つのセル値によるものである場合には。ファイルは、スプレッドシートによって前処理され、ただ一つのセルが非数値である場合、完全なベクターが非数値として見られている。

+4

列の値は、個別に数値にすることはできません。列が数値かそうでないかのいずれかです。あなたは例を挙げることができますか? – Hugh

+2

'lapply(data、function(i)as.numeric(as.character(i)))'のようなものを試しましたか? – Sotos

+2

あなたは 'mydf [] < - lapply(mydf、as.numeric)'のようなものがほしいと思っています - @Sotosが私を打ち負かしました;-) – A5C1D2H2I1M1N2O1R2T1

答えて

2

に基づきますあなたの編集ここでは、数値でなければなりませんベクトルを持っていますが、原因読書インプロセス中に導入されたいくつかの誤ったデータを、データが(おそらくcharacterまたはfactor)別の形式に変換されています。

ものの一例ですケース。mydf1 <- mydf2 <- mydf3 <- data.frame(...)は、同じデータを持つ3つのdata.frameを作成するだけです。

# I'm going to show three approaches 
mydf1 <- mydf2 <- mydf3 <- data.frame(
    A = c(1, 2, "x", 4), 
    B = c("y", 3, 4, "-") 
) 

str(mydf1) 
# 'data.frame': 4 obs. of 2 variables: 
# $ A: Factor w/ 4 levels "1","2","4","x": 1 2 4 3 
# $ B: Factor w/ 4 levels "-","3","4","y": 4 2 3 1 
012これを行う1つの方法は、単にRは NAに数値に変換できない任意の値を強制させることです

## You WILL get warnings 
mydf1[] <- lapply(mydf1, function(x) as.numeric(as.character(x))) 
# Warning messages: 
# 1: In FUN(X[[i]], ...) : NAs introduced by coercion 
# 2: In FUN(X[[i]], ...) : NAs introduced by coercion 

str(mydf1) 
# 'data.frame': 4 obs. of 2 variables: 
# $ A: num 1 2 NA 4 
# $ B: num NA 3 4 NA 

別のオプションは、my SOfun packageからmakemeNAを使用することです:

library(SOfun) 
makemeNA(mydf2, "[^0-9]", FALSE) 
# A B 
# 1 1 NA 
# 2 2 3 
# 3 NA 4 
# 4 4 NA 

str(.Last.value) 
# 'data.frame': 4 obs. of 2 variables: 
# $ A: int 1 2 NA 4 
# $ B: int NA 3 4 NA 

この関数は、type.convertを使用して変換を行い、より具体的な変換ルールをNAに処理できます(ちょうど、データiを読み取るときにna.stringsのベクトルを使用できるように) ntoR)。あなたのエラーについて


、私はあなたが示していたエラーを得るためにあなたのdata.frameas.numericを試しているだろうと信じています。

例:

# Your error... 
as.numeric(mydf3) 
# Error: (list) object cannot be coerced to type 'double' 

あなたはかかわらmatrixにそのエラーを取得することはできません(それでも警告を取得します)....

# You'll get a warning 
as.numeric(as.matrix(mydf3)) 
# [1] 1 2 NA 4 NA 3 4 NA 
# Warning message: 
# NAs introduced by coercion 

なぜ我々はしないでください明示的にas.characterを使用する必要がありますか? as.matrixあなたのために:

str(as.matrix(mydf3)) 
# chr [1:4, 1:2] "1" "2" "x" "4" "y" "3" "4" "-" 
# - attr(*, "dimnames")=List of 2 
# ..$ : NULL 
# ..$ : chr [1:2] "A" "B" 

この情報はどのように使用できますか?

mydf3[] <- as.numeric(as.matrix(mydf3)) 
# Warning message: 
# NAs introduced by coercion 

str(mydf3) 
# 'data.frame': 4 obs. of 2 variables: 
# $ A: num 1 2 NA 4 
# $ B: num NA 3 4 NA 
+0

私の質問の背景にお返事いただきありがとうございます。私はいくつかの時点で強制的なエラーを得て、今はそれらが何を意味しているか知っています。欠けているデータはお尻の痛みで、基本的な理解を得るために少なくとも1日はかかりました。この回答のような追加の説明が役立ちます。 – Arnold

+0

@Arnold、[OK]をクリックします。私はうまくいけば役に立つ情報をいくつか追加しました。 – A5C1D2H2I1M1N2O1R2T1

+0

@ A5C1D2H2I1M1N2O1R2T1、それはあなたに非常に寛大です!私はすでにあなたの提案の一部を適用し、彼らは本当に助けます。どうもありがとうございました!! – Arnold

関連する問題