我有一个包含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?感谢。
答案 0 :(得分:3)
fill=TRUE
(或其派生表亲read.table
)参数的read.csv
设置可能就是您要找的。 p>
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
,因此fill
中read.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
)