0

我有一个包含 7 列的数据文件 A,没有缺失值,我将join一个包含 28 个字段的数据文件 B 统一到该文件中。结果文件是 C。如果在 B 中没有找到匹配项,则 C 中的输出行只有 7 列。如果 B 中有匹配项,则 C 中的输出行有 35 列。我已经选择了填补缺失的 28 个字段,但没有成功join-e

我正在尝试做的是MISSOVER在 R 中复制 SAS 的输入语句。例如,以下代码可以完美运行:

 dat <- textConnection('x1,x2,x3,x4
 1,2,"present","present"
 3,4
 5,6')

 df <- read.csv(dat, sep=',' , header=T , 
     colClasses = c("numeric" , "numeric", "character", "character"))

 > df
   x1 x2      x3      x4
 1  1  2 present present
 2  3  4                
 3  5  6   

但是当我尝试加载我的 C 文件时,我收到以下错误(使用TRUE而不是T):

 df <- read.table( 'C.tab' , header=T , sep='\t', fill=TRUE,
                   colClasses = c(rep('numeric',7),rep('character',28)))


 Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings,  : 
   line 1 did not have 35 elements

第一行(C 中的第二行,在标题之后)确实只有 A 中的 7 个字段。在 SAS 中,我会使用该MISSOVER语句将所有那些尾随缺失的字段设置为某个缺失值。我怎么能在 R 中做到这一点?谢谢。

4

1 回答 1

3

(或其派生表亲)的fill=TRUE参数设置可能是您正在寻找的。read.tableread.csv

  df <- read.table(dat, sep=',' , header=T , fill=TRUE,
      colClasses = c("numeric" , "numeric", "character", "character"))
 df
#
  x1 x2      x3      x4
1  1  2 present present
2  3  4                
3  5  6      

fill 的默认值为 TRUE read.csv,但您的错误表明您使用了 fill=T ,这表明您T在工作区中有一个名为的对象。read.table 的默认值是fill=!blank.lines.skip并且因为默认值也是 ,所以inblank.lines.skip = TRUE的通常默认值是 FALSE。fillread.table

您编辑的问题表明您在字符字段中存在其他问题。通常的嫌疑人是不匹配的引号或 octothorpes( #),它们实际上是行终止符,所以试试这个:

df <- read.table( 'C.tab' , header=T , sep='\t', fill=TRUE, 
              quote="",
              comment.char="",
              colClasses = c(rep('numeric',7),rep('character',28)))

如果您在处理与每行不同数量的项目相关的错误时遇到困难,使用count.fields. 它接受与所使用的参数相似的参数read.table。如果您有大量输入行,则将调用包装在调用中会很有count.fieldstable

length_tbl <- table( count.fields( 'C.tab' , header=TRUE , sep='\t', 
                                    quote="",
                                    comment.char="")
                     )

然后,您可以尝试不同的选项。一旦你知道你在找什么,你还可以通过which在 count.fields 周围调用来识别导致问题的行号:

bad_lines <- which( count.fields( 'C.tab' , header=TRUE , sep='\t', 
                                    quote="",
                                    comment.char="")
                     != 7  # or whatever is the "correct" length
                     )
于 2013-09-18T18:00:44.163 回答