【问题标题】:Error in read.fwf when header=TRUEheader=TRUE 时 read.fwf 出错
【发布时间】:2014-02-06 02:03:54
【问题描述】:

我的模拟数据如下所示:

LastName   Date      email                                                    CreditCardNum   AgeZip  Amount
Paul       21/02/14  Aliquam.fringilla@dolordapibus.co.uk                     4241033422900360 6738851$14.39
Bullock      2/7/2014adipiscing.fringilla@lectusjusto.org                     5178789953524240 3336538$498.31
Mcmahon     11/5/2013lobortis.ultrices@lacus.org                              5389589582467450 7734302$92.44
Walters    25/09/13  consectetuer.cursus.et@sitamet.org                       5157094536097720 7794007$206.60
Franco     17/06/13  et@disparturientmontes.ca                                 345477952996264 2415873$89.12

这就是我尝试将其导入 R 的方式,带有标题:

w <- c(11,10,57,16,3,5,8)
df <- read.fwf("data.txt",widths=w,stringsAsFactors=F)
names(df) <- df[1,]; df <- df[-1,]

我不使用header=T 的原因是它给了我错误:

Error in read.table(file = FILE, header = header, sep = sep, row.names = row.names,  :  more columns than column names

这不是真的。我知道宽度 (w) 是正确的。那么这个错误是从哪里来的呢?我的解决方案运行良好,我只是想了解发生了什么。

【问题讨论】:

  • 您能否提供您的w 向量,以便(更多)可重现?
  • 是的,抱歉:w &lt;- c(11,10,57,16,3,5,8)。已编辑。
  • 我现在有点不清楚你的问题是什么。你想知道为什么会抛出错误吗?还是您在寻求优雅的解决方法?您提出的指定header=F 的方法似乎很好。
  • 我想知道为什么首先会出现错误。再次编辑。
  • 嗯,这是因为您需要确保您的标题行符合sep 的规范,默认为\t。你的没有。

标签: r import fixed-width


【解决方案1】:

如果您指定header=TRUE,则按照?read.fwf,您必须确保列名由sep 分隔。默认情况下,名称由\t(制表符)分隔,您的数据不能这样。

以下工作正常:

w <- c(11, 10, 57, 16, 3, 5, 8)

read.fwf(widths=w, header=TRUE, sep='|', 
file=textConnection('LastName   |Date      |email                                                    |CreditCardNum   |Age|Zip  |Amount
Paul       21/02/14  Aliquam.fringilla@dolordapibus.co.uk                     4241033422900360 6738851$14.39
Bullock      2/7/2014adipiscing.fringilla@lectusjusto.org                     5178789953524240 3336538$498.31
Mcmahon     11/5/2013lobortis.ultrices@lacus.org                              5389589582467450 7734302$92.44
Walters    25/09/13  consectetuer.cursus.et@sitamet.org                       5157094536097720 7794007$206.60
Franco     17/06/13  et@disparturientmontes.ca                                 345477952996264 2415873$89.12'))

【讨论】:

  • 我想知道 read.fwf() 中的“sep”参数应该用于什么。有点打败了imo的目的。无论哪种方式,我都希望有一个不需要我修改实际数据的解决方案,即使修改很小并且可以轻松自动化。另请注意,w 与您(有理由)假设的不同;见我上面的评论。
  • 刚刚注意到我结合了年龄和拉链。我会编辑我的帖子。我还认为fwf 数据的标题通常与后续行的宽度相同,所以我同意你关于冗余的观点。
  • 它们的宽度相同,只是间距关闭了。在这一步之后,我会修剪前导和尾随空格。
  • 刚刚遇到这个问题 - 直到遇到这个问题之前我一直以为我疯了。我无法想象这是故意的!
  • @thelatemail - 是的,看起来很奇怪
猜你喜欢
  • 1970-01-01
  • 2017-05-06
  • 2019-11-17
  • 1970-01-01
  • 2020-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-10
相关资源
最近更新 更多