web-dev-qa-db-ja.com

read.csv空白フィールドにNA

「a.txt」という名前のタブ区切りテキストファイルがあります。 D列は空です。

 A       B       C    D
10      20     NaN
30              40
40      30      20
20      NA      20

2番目の行と2番目の列にスペースを入れて、データフレームをテキストファイルとまったく同じように表示および動作させたいと思います。

残念ながら、read.csvはすべての空白とNAを「NA」に変換しています。 NAとNaNを文字として読みたいです。

 b<- read.csv("a.txt",sep="\t", skip =0, header = TRUE, comment.char = "",check.names = FALSE, quote="", )

要約すると、出力ファイルの同じ値を変更せずに複製したい:

  • 入力に空白がある場合、出力は空白になります。
  • 入力にNAまたはNanがある場合、出力にもNAまたはNaNが必要です。
23
user1631306

Csvファイルを読んだ後、次を試してください。 NA値を「」に置き換えます。

b[is.na(b)]<-""

NaN値が修正されないことはかなり確かです。それは別のステートメントで解決する必要があります

b[is.nan(b)]<-""
11
silly_penguin

Na.stringsのデフォルトは単なる「NA」なので、おそらく「NaN」を追加する必要があります。真の空白( "")は欠落に設定されますが、スペース( "")はそうではありません。

 b<- read.csv("a.txt",  skip =0,  
               comment.char = "",check.names = FALSE, quote="",
               na.strings=c("NA","NaN", " ") )

データ例の形式が正しくなく、コンマがないため、これが問題であることは明らかではありません。 read.csvではタブ区切りが許可されていないため、これが根本的な問題になる可能性があります。つかいます read.delimまたはread.tableデータにタブ区切りがある場合。

b<- read.table("a.txt", sep="\t" skip =0, header = TRUE, 
               comment.char = "",check.names = FALSE, quote="",
               na.strings=c("NA","NaN", " ") )

# worked example for csv text file connection
 bt <- "A,B,C  
10,20,NaN
30,,40
40,30,20
,NA,20"

 b<- read.csv(text=bt, sep=",", 
                comment.char = "",check.names = FALSE, quote="\"",
                na.strings=c("NA","NaN", " ") )
 b
#--------------
   A  B  C
1 10 20 NA
2 30 NA 40
3 40 30 20
4 NA NA 20

例2:

bt <- "A,B,C,D
10,20,NaN
30,,40
40,30,20
,NA,20"

 b<- read.csv(text=bt, sep=",", 
                comment.char = "",check.names = FALSE, quote="\"",
                na.strings=c("NA","NaN", " ") , colClasses=c(rep("numeric", 3), "logical")) 
 b
#----------------
   A  B  C  D
1 10 20 NA NA
2 30 NA 40 NA
3 40 30 20 NA
4 NA NA 20 NA
> str(b)
'data.frame':   4 obs. of  4 variables:
 $ A: num  10 30 40 NA
 $ B: num  20 NA 30 NA
 $ C: num  NA 40 20 20
 $ D: logi  NA NA NA NA

NAとNaNが数値ベクトルで同一ではないことは少し興味深いです。 NaNは、数学的な意味を持たない操作によって返されます(ただし、?NaN、操作の結果は特定のOSに依存する場合があります。同等性のテストは、NaNまたはNAのいずれにも適していません。特定のis関数があります:

> Inf*0
[1] NaN

> is.nan(c(1,2.2,3,NaN, NA) )
[1] FALSE FALSE FALSE  TRUE FALSE
> is.na(c(1,2.2,3,NaN, NA) )
[1] FALSE FALSE FALSE  TRUE  TRUE  # note the difference
34
42-

read.csvステートメントでcolClassesを指定して、列をテキストとして読み取ることができます。

2
TheComeOnMan

Na.string引数を使用します。
na.stringは、データからna値として読み取られる引数を定義するために使用されます。あなたが言及した場合

read.csv(text=bt, na.string = "abc")

データのどこでもabcになり、naに変換されます。
abcはデータに見つからないため、値をnaに変換しません。

0
Karan