空白空间在fread中未被识别为NA

SJB*_*SJB 11 r data.table

我有一个大文件,必须在R中导入.我用于fread此目的.fread将数字字段中的空格识别为NA,但不识别字符和整数64字段中的空格为NA.

fread 将空格识别为字符字段的空单元格,并将整数64字段的空格识别为0.

当我使用导入相同的数据时read.table,它将所有空格都识别为NA.

请找一个可重复的例子,

library(data.table)
x1 <- c("","","")
x2 <- c("1006678566","","1011160152")
x3 <- c("","ac","")
x4 <- c("","2","3")
df <- cbind.data.frame(x1,x2,x3,x4)
write.csv(df,"tr.csv")

tr1 <- fread("tr.csv", header=T, fill = T,
             sep= ",", na.strings = c("",NA), data.table = F,
             stringsAsFactors = FALSE)

tr2 <- read.table("tr.csv", fill = TRUE, header=T, 
                  sep= ",", na.strings = c(""," ", NA), 
                  stringsAsFactors = FALSE)
Run Code Online (Sandbox Code Playgroud)

通过fread导入

详细输出:

Input contains no \n. Taking this to be a filename to open
[01] Check arguments
  Using 4 threads (omp_get_max_threads()=4, nth=4)
  NAstrings = [<<>>, <<NA>>]
  None of the NAstrings look like numbers.
  show progress = 1
  0/1 column will be read as integer
[02] Opening the file
  Opening file tr.csv
  File opened, size = 409 bytes.
  Memory mapped ok
[03] Detect and skip BOM
[04] Arrange mmap to be \0 terminated
  \n has been found in the input and different lines can end with different line endings (e.g. mixed \n and \r\n in one file). This is common and ideal.
[05] Skipping initial rows if needed
  Positioned on line 1 starting: <<"","x1","x2","x3","x4","x5","x>>
[06] Detect separator, quoting rule, and ncolumns
  Using supplied sep ','
  sep=','  with 7 fields using quote rule 0
  Detected 7 columns on line 1. This line is either column names or first data row. Line starts as: <<"","x1","x2","x3","x4","x5","x>>
  Quote rule picked = 0
  fill=true and the most number of columns found is 7
[07] Detect column types, good nrow estimate and whether first row is column names
  'header' changed by user from 'auto' to true
  Number of sampling jump points = 1 because (407 bytes from row 1 to eof) / (2 * 407 jump0size) == 0
  Type codes (jump 000)    : 56A255A  Quote rule 0
  All rows were sampled since file is small so we know nrow=16 exactly
[08] Assign column names
[09] Apply user overrides on column types
  After 0 type and 0 drop user overrides : 56A255A
[10] Allocate memory for the datatable
  Allocating 7 column slots (7 - 0 dropped) with 16 rows
[11] Read the data
  jumps=[0..1), chunk_size=1048576, total_size=373
Read 16 rows x 7 columns from 409 bytes file in 00:00.042 wall clock time
[12] Finalizing the datatable
  Type counts:
         1 : bool8     '2'
         3 : int32     '5'
         1 : int64     '6'
         2 : string    'A'
=============================
   0.009s ( 22%) Memory map 0.000GB file
   0.029s ( 68%) sep=',' ncol=7 and header detection
   0.002s (  5%) Column type detection using 16 sample rows
   0.001s (  2%) Allocation of 16 rows x 7 cols (0.000GB) of which 16 (100%) rows used
   0.001s (  2%) Reading 1 chunks (0 swept) of 1.000MB (each chunk 16 rows) using 1 threads
   +    0.000s (  0%) Parse to row-major thread buffers (grown 0 times)
   +    0.000s (  0%) Transpose
   +    0.001s (  2%) Waiting
   0.000s (  0%) Rereading 0 columns due to out-of-sample type exceptions
   0.042s        Total
Run Code Online (Sandbox Code Playgroud)

请帮我解决这个问题.

谢谢!

Dra*_*dur 5

@SJB 用作na.strings = c(NA_character_, "")参数fread(),空格/单元格将被读取为 NA。

各种数据类型都有多种形式的 NA。请参阅help(NA):NA_character_ NA_real_ NA_integer_ 等。


Deb*_*Deb 0

我发现的一件事是当我们执行 write.csv() 时数据的保存方式。

打开 csv 文件并点击删除 X4 中的空白单元格并保存。如果您现在导入它,NA 将显示在 R 中。

去检查:

apply(tr1, 2, function(x) length(which(is.na(x))))
Run Code Online (Sandbox Code Playgroud)

V1×1×2×3×4

0 3 1 2 1

如果有一个带有空白的 csv 文件,我们使用

na.strings("", NA)

字符数据类型对于空白也显示为“NA”。