【问题标题】:"Block-wise" ASCII/text file as input“逐块” ASCII/文本文件作为输入
【发布时间】:2014-02-25 00:12:03
【问题描述】:

我想阅读一个文本文件(制表符分隔)。 问题是每组措施都是“按块”组织的。

例如,使用此输入 (bodydata.txt):

Body fat
08/21/2013  1:46 PM 17.4
08/20/2013  11:20 AM    17.4
08/17/2013  10:49 AM    17.2
08/16/2013  1:33 PM 17.4
08/15/2013  12:07 PM    17.5
08/14/2013  11:18 AM    17.4
08/13/2013  12:17 PM    17.3

Body weight
08/21/2013  1:46 PM 157
08/20/2013  11:20 AM    156.4
08/17/2013  10:49 AM    155
08/16/2013  1:33 PM 157
08/15/2013  12:07 PM    157
08/14/2013  11:17 AM    157
08/13/2013  12:16 PM    157.4
08/11/2013  4:47 PM 158.2

我想导入它们并为每个度量设置单独的数据框,如下所示:

> weight
          V1       V2   V3
1 08/21/2013  1:46 PM 17.4
2 08/20/2013 11:20 AM 17.4
3 08/17/2013 10:49 AM 17.2
4 08/16/2013  1:33 PM 17.4
5 08/15/2013 12:07 PM 17.5
6 08/14/2013 11:18 AM 17.4
7 08/13/2013 12:17 PM 17.3

在 Unix 环境下,用sed(如this)拆分文本文件并不难,但该解决方案不可移植。如果我能以 R 原生方式找到解决方案,那就太好了。有什么建议吗?

附:我无法为在线搜索找到好的关键字。我将不胜感激任何文章/线程或谷歌搜索。如果有我不知道的重复文章,我很抱歉。

【问题讨论】:

    标签: r import


    【解决方案1】:

    您的文件没有制表符,因此我将使用空格作为分隔符。我使用 blenk line 作为文件分隔符:

    Lines <- readLines(textConnection("Body fat
    08/21/2013  1:46 PM 17.4
    08/20/2013  11:20 AM    17.4
    08/17/2013  10:49 AM    17.2
    08/16/2013  1:33 PM 17.4
    08/15/2013  12:07 PM    17.5
    08/14/2013  11:18 AM    17.4
    08/13/2013  12:17 PM    17.3
    
    Body weight
    08/21/2013  1:46 PM 157
    08/20/2013  11:20 AM    156.4
    08/17/2013  10:49 AM    155
    08/16/2013  1:33 PM 157
    08/15/2013  12:07 PM    157
    08/14/2013  11:17 AM    157
    08/13/2013  12:16 PM    157.4
    08/11/2013  4:47 PM 158.2")
    )
    
    sdat <- split(Lines, cumsum(nchar(Lines)==0))
    lapply(sdat , function(lins) {
                     good<- lins[nchar(lins)>0]
                     assign(make.names(good[1]),   #name
                            read.table(text=good[-1]) , envir=.GlobalEnv) })
    

    您将看到该函数打印拆分表,但作为副作用,您的全局环境中将有两个对象,分别名为 Body.fatBody.weight。如果原始文件中确实有标签,您可能希望将 sep="\t" 放入 read.table 调用中。

    【讨论】:

    • 太棒了。我永远不会想到使用cumsumsplit 做一个“因素”。谢谢你的解决方案。当我复制'n'粘贴原始文件时,选项卡会丢失。原始文件确实有标签,我使用 sep="\t" 来确认您的解决方案。感谢您的提醒!
    • 我将这些答案归功于多年观看 Jim Holtman 在 Rhelp 上执行文件欺骗和轻率操作
    • 酷。现在我喜欢阅读他在 Rhelp 上的帖子。有一些创造力总是很有趣的。
    猜你喜欢
    • 2013-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-11
    • 2023-03-14
    • 2016-01-24
    • 2017-03-27
    相关资源
    最近更新 更多