【问题标题】:Reading text file that is "next line delimited"读取“下一行分隔”的文本文件
【发布时间】:2019-09-05 02:00:45
【问题描述】:

我不知道如何正确表达这个问题,所以我举个例子。
假设我有一个.txt 文件,其中第一行是日期,第二行是文本。然后模式重复,第 3 行是 DATE,第 4 行是 TEXT。 我如何将其读入R 并将其转换为两列dataframe
本质上我认为它是“下一行分隔”,不确定这是否是描述它的正确方式。

这是一个将保存在.txt 文件中的示例数据:

.LOG
3:42 PM 12/04/2019
Task 1
3:45 PM 12/04/2019
Task 2
3:55 PM 13/04/2019
Task 3
3:47 PM 15/04/2019

我希望它看起来像:

DATE                TEXT
3:42 PM 12/04/2019  Task 1
3:45 PM 12/04/2019  Task 2
3:55 PM 13/04/2019  Task 3

【问题讨论】:

    标签: r import read.table


    【解决方案1】:

    matrix 方法是更好的选择

    as.data.frame(matrix(trimws(df$V1), ncol = 2, byrow = TRUE, 
              dimnames = list(NULL, c("DATE", "TEXT"))))
    #               DATE   TEXT
    #1 3:42 PM 12/04/2019 Task 1
    #2 3:45 PM 12/04/2019 Task 2
    #3 3:55 PM 13/04/2019 Task 3
    

    读取数据集后

    数据

    df <- read.table("file.txt", sep = "\n")
    

    【讨论】:

    • 我是否正确地说这将扩展到任何大小的df?换句话说,如果必须使用前 3 行填充 3 列,我将替换 ncol = 3?
    • @jmich738 是的,你是对的,假设行是 3 的倍数
    【解决方案2】:

    使用read.tablesep = "\n" 读取文件,这样您将拥有单列数据框

    df <- read.table(text = "3:42 PM 12/04/2019
                     Task 1
                     3:45 PM 12/04/2019
                     Task 2
                     3:55 PM 13/04/2019
                     Task 3", sep = "\n")
    

    为了从文件中读取它做

    df <- read.table("path_of_the_file.txt", sep = "\n")
    

    现在通过选择交替行将其分成两列

    data.frame(Date = df[c(TRUE, FALSE), ], Text = df[c(FALSE, TRUE), ])
    
    #               Date    Text
    #1 3:42 PM 12/04/2019 Task 1
    #2 3:45 PM 12/04/2019 Task 2
    #3 3:55 PM 13/04/2019 Task 3
    

    【讨论】:

    • 这似乎是一个非常有创意的解决方案。您能解释一下它是如何工作的吗?我了解df[Row, Column]。那么对于 Row 参数,为什么 c(T,F) 有效?我原以为要这样做,您需要为每一行说明 T/F?谢谢
    • @jmich738 TRUE/FALSE 值被回收,因此无论行数如何,它都会自动选择备用行。您可以查看c(1:10)[c(TRUE, FALSE)]c(1:10)[c(FALSE, TRUE)] 以了解其工作原理。
    【解决方案3】:

    你可以这样做:

     MessyData <- read.table("Myfile.txt")
     CleanData <- data.frame(DATE = MessyData[seq(1, length(MessyData), by = 2)],
                             TEXT = MessyData[seq(2, length(MessyData), by = 2)])
    

    【讨论】:

    • 我无法让这个工作。第一行,没有sep="\n",它给了我一个错误Error in scan(file = file, what = what, sep = sep, quote = quote, dec = dec, : line 6 did not have 3 elements。但是一旦我添加 sep="\n" 并运行第 2 行,它就会给我错误 Error in seq.default(2, length(MessyData), by = 2) : wrong sign in 'by' argument
    • 是的,这正是我开始尝试读取文件的地方,但是如果没有我实际拥有文件,很难解决您在读取文件时遇到的任何问题。 :-) 至于添加 sep = "\n" 时仍然出现的错误,可能是 b/c 你现在有一个 data.frame。您想将我的回答中的“长度”更改为“nrow”。
    猜你喜欢
    • 2019-02-03
    • 2020-11-21
    • 2019-12-07
    • 2021-03-27
    • 1970-01-01
    • 2013-11-04
    • 1970-01-01
    • 2019-04-01
    • 1970-01-01
    相关资源
    最近更新 更多