【问题标题】:Converting text file into data frame in R在R中将文本文件转换为数据框
【发布时间】:2025-12-02 10:50:01
【问题描述】:

我的原始数据在一个文本文件中,值之间没有特定的分隔符,如下所示:

101  10.08  S   A  05OCT93 GOLDEN GATE BRIDGE  4110   6548   6404   55930

在 R 中应用 read.table 会创建一个每行只有一个变量的数据框,而我想要一个每行有 10 个变量的数据框(10 个值中的每个变量一个)。如果文本文件中没有分隔符,我该如何实现?

【问题讨论】:

  • 这可能会有所帮助:*.com/questions/17302986/…
  • 如果您希望我们了解为什么您“每行仅获取一个变量”,您需要发布代码?
  • 您希望将示例行中的 12 个空格分隔的值随机分配给 10 个值吗?如果不是这种情况,您需要具体说明在分隔每一行方面是否有任何规则/模式。

标签: r import read.table


【解决方案1】:

我们假设每个字段都由非空格组成,除了可能有嵌入空格的字段 6。

创建测试文件

Lines <- "101 10.08 S A 05OCT93 GOLDEN GATE BRIDGE 4110 6548 6404 55930
101 10.08 S A 05OCT93 GOLDEN GATE BRIDGE 4110 6548 6404 55930
"
cat(Lines, file = "myfile.txt")

运行。使用readLines 读取文件,生成L。然后在gsubfn package 中使用gsubfn 在产生g 的字段之间插入sep 定义的字符。 最后读取g中的文字,使用read.table创建数据框:

library(gsubfn)
L <- readLines("myfile.txt")

sep <- ";"  # choose any character not in the file

pat <- "(\\S+) (\\S+) (\\S+) (\\S+) (\\S+) (\\S.*\\S) (\\S+) (\\S+) (\\S+) (\\S+)"
pat <- gsub(" ", "\\s+", pat) # can omit if there is only 1 space between fields
g <- gsubfn(pat, ... ~ paste(..., sep = sep), L)

read.table(text = g, sep = sep)

输出。最后一行的结果是:

   V1    V2 V3 V4      V5                 V6   V7   V8   V9  V10
1 101 10.08  S  A 05OCT93 GOLDEN GATE BRIDGE 4110 6548 6404 1010
2 101 10.08  S  A 05OCT93 GOLDEN GATE BRIDGE 4110 6548 6404 1010

【讨论】:

    【解决方案2】:

    另一种可能是这是一个固定宽度的格式文件。如果您发布了几行,我们会更好地理解这种可能性:

    require(foreign)
    txt2 <- "101  10.08  S   A  05OCT93 GOLDEN GATE BRIDGE  4110   6548   6404   55930"
    read.fwf(file=textConnection(txt2), c(4,6,3,4,9,20,6,8,8,8))
       V1    V2  V3   V4        V5                   V6   V7   V8   V9   V10
    1 101 10.08   S    A   05OCT93  GOLDEN GATE BRIDGE  4110 6548 6404 55930
    

    【讨论】:

      【解决方案3】:

      你确定只有十列吗?

      > read.table(text="101 10.08 S A 05OCT93 GOLDEN GATE BRIDGE 4110 6548 6404 55930")
         V1    V2 V3 V4      V5     V6   V7     V8   V9  V10  V11   V12
      1 101 10.08  S  A 05OCT93 GOLDEN GATE BRIDGE 4110 6548 6404 55930
      

      【讨论】: