【问题标题】:Setting column width in a data set设置数据集中的列宽
【发布时间】:2011-10-21 02:52:09
【问题描述】:

我想在这个数据集中设置列宽(对于所有 3 列),如:anim=1-10;西雷德=11-20;达米德=21-30。有些列有缺失值。

anim=c("1A038","1C467","2F179","38138","030081")
sireid=c("NA","NA","1W960","1W960","64404")
damid=c("NA","NA","1P119","1P119","63666")

mydf=data.frame(anim,sireid,damid)

【问题讨论】:

  • 老实说,我真的不知道您所说的列宽是什么意思。你能更详细地解释一下吗?
  • @joran: 示例:我想将第一列(“anim”)的宽度或长度设置为 1-6。我根据可能的最大字符数设置长度 a 。例如,最后一个动画 id 是“030081”有 6 个字符。我想对这两列做同样的事情。谢谢!
  • 听起来洪是对的;我从来没有使用过 SAS,所以我从来没有想过有人会想在 R 中这样做。
  • @joran:它不仅仅是 R 的一个函数,尽管 R 可以利用它。正如我在下面 Hong 的回答中提到的那样 - 固定宽度的文件对于内存映射很有用:人们将确切地知道在哪里寻找数据,因为布局适合于一个非常简单的映射功能。因此,不需要对每一行进行索引,也不需要解析每一行,以获得对数据的随机访问。内存映射文件不必是二进制文件,如bigmemory。能够知道在哪里查找意味着数据可以是海量的(尽管 ASCII 格式是一种顽皮的浪费)。

标签: r fixed-width multiple-columns


【解决方案1】:

从阅读您的问题以及您的 cmets 到以前的答案,在我看来,您正在尝试使用您的数据创建一个 固定宽度文件。如果是这种情况,您可以使用包gdata中的函数write.fwf

加载包并创建一个临时输出文件:

library(gdata)
ff <- tempfile()

将您的数据以固定宽度格式写入临时文件:

write.fwf(mydf, file=ff, width=c(10,10,10), colnames=FALSE)

scan读取文件并打印结果(演示固定宽度输出):

zz <- scan(ff, what="character", sep="\n")
cat(zz, sep="\n")

1A038      NA         NA        
1C467      NA         NA        
2F179      1W960      1P119     
38138      1W960      1P119     
030081     64404      63666    

删除临时文件:

unlink(ff)

【讨论】:

  • 还必须在 R 中处理 fw 数据。请注意,还有 `read.fwf
  • @ran2 非常正确。有一个函数read.fwf。我不想在我的示例中使用它,因为我想说明每一行都是一个字符串(read.fwf 会解析这些值。)
  • 嘿,无意冒犯 - 并不是为了改进您的示例而只是为了完整性而添加此评论;)特别是因为它来自另一个包(utils)IIRC。
  • @Andrie:我正在尝试获取新数据框(设置列宽)并将其写入新文件。我怎样才能做到这一点? ...我为这个问题道歉。
  • 这就是write.fwf 为您所做的——它将您的数据写入文件。
【解决方案2】:

您还可以使用派生自 C 对应物的 sprintf() 函数为数字和字符串编写固定宽度的输出。

例如,用 0 填充整数:

sprintf("%012d",99)

用空格填充: sprintf("%12d",123)

并填充字符串:

sprintf("%20s","hello world")

格式化选项可通过?sprintf 找到,并且有许多将 C 输出格式化为固定宽度的指南。

【讨论】:

    【解决方案3】:

    听起来您来自 SAS 背景,其中字符变量应明确指定长度以避免意外截断。在 R 中,您无需担心这一点。一个字符串有它需要的任意多的字符,并且会随着它的内容的变化而自动扩展和收缩。

    不过,您应该注意的一件事是将字符变量静默转换为数据框中的因子。但是,除非您稍后更改内容,否则您应该可以使用默认设置。

    【讨论】:

    • 我正在使用 R 来设置我将要在另一个程序中运行的数据。谢谢!
    • 啊,在这种情况下,最好将其导出为逗号分隔的文件 (csv),而不是使用固定宽度的字段。虽然可以导出为固定宽度,但它可能比它的价值更麻烦。大多数程序会直接读取 csv 文件。
    • 这通常是正确的,但是固定宽度的文件对于内存映射很有用:人们会确切地知道在哪里查找数据,因为布局适合于非常简单的映射功能。因此,不需要对每一行进行索引,也不需要解析每一行,就可以随机访问数据。
    猜你喜欢
    • 2013-11-18
    • 2012-11-27
    • 2018-03-28
    • 2017-02-07
    • 1970-01-01
    • 2014-04-04
    • 1970-01-01
    • 2019-08-08
    • 2014-06-29
    相关资源
    最近更新 更多