SAS的MISSOVER用于R中的数据输入

时间:2013-09-18 17:50:26

标签: r read.table

我有一个包含7列,没有缺失值的数据文件A,我已经unix - join编辑了一个包含28个字段的数据文件B.结果文件为C.如果在B中找不到匹配项,则C中的输出行只有7列。如果B中存在匹配,则C中的输出行有35列。我已经开始join的{​​{1}}选项来填补28个filds的缺失,但没有成功。

我要做的是在R中复制SAS的-e输入语句。例如,以下代码完美运行:

MISSOVER

但是当我尝试加载我的C文件时,我收到以下错误(使用 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 代替TRUE):

T

第一行(C中的第二行,在标题之后)确实只有来自A的那7个字段。在SAS中,我使用 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 语句将所有那些尾随缺失字段设置为缺少某些字段值。我怎么能在R?感谢。

1 个答案:

答案 0 :(得分:3)

fill=TRUE(或其派生表亲read.table)参数的read.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      

read.csv的填充默认值为TRUE,但您的错误表明您使用了fill = T,表明您的工作区中有一个名为T的对象。 read.table的默认值为fill=!blank.lines.skip,由于默认值为blank.lines.skip = TRUE,因此fillread.table的常用默认值为FALSE。

您编辑的问题表明您的角色字段中存在其他问题。通常的嫌疑人是无与伦比的引号或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.fields调用中将呼叫包裹到table非常有用:

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

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

bad_lines <- which( count.fields( 'C.tab' , header=TRUE , sep='\t', 
                                    quote="",
                                    comment.char="")
                     != 7  # or whatever is the "correct" length
                     )