【问题标题】:Read.table isn't interpreting the number of columns in a table correctlyRead.table 没有正确解释表中的列数
【发布时间】:2020-10-15 11:18:26
【问题描述】:

我是 R 新手,正在尝试大规模引入 24 列只有一行的表格。

这些表位于使用 print() 函数从不同的 R 代码和 bash 脚本输出的文本文件中 - 我这样做是因为我必须一次输出 1000 个这些表,并且希望能够快速扫描他们。如上所述,输出有很多列但只有一行,当它在文本文件中时,表格会溢出到多行。

这是一个为简单起见而修改的表格示例 - 实际上,有一些额外的列会导致更多行,但都一样,只有一行,每列名称都是“columnx”(在真实的东西。)

我使用 read.table 将表格引入 R 的方法之一,然后将“header”和“fill”设置为 TRUE。 (我也摆弄过 readLines、readCVS、scan 等,但 read.table 是迄今为止最好的结果。)但是,当我这样做时,它只会将列标题的第一行解释为列。下面的所有内容,包括其他列和列名,都是属于这些列的行。所以在上图的情况下,只有columns1:17 包含在列标题中。

我想知道在我尝试使用 readLines 读取它并解析它之前,是否有人对从哪里开始解决这个问题有任何建议。我正在尝试找到更改输出的解决方案,以便文本文件在一行上生成所有列。

谢谢!

【问题讨论】:

  • 您对其他 R 代码有任何控制权吗?依赖print() 并将输出写入文件的方法将根据每次运行其他脚本时控制台的宽度为您提供不同的东西。最好能够使用write.csv 或其他旨在将数据写入其他脚本中的文件的函数,这将使读取该脚本中的数据变得容易。
  • 如果没有样本数据,我无法对此进行任何尝试,我也不会尝试将其转录为可用的东西。当原始文件(前两行)应该很容易包含在您问题的代码块中时,请不要包含数据/代码/错误的图像。
  • @r2evans 对此感到抱歉!我认为代码块仅用于代码脚本,但现在我正在阅读它,我可以看到我对此一无所知,以及它如何被认为是非常糟糕的形式哈哈。感谢您的反馈并让我知道。 :)
  • “代码块”非常适合任何受益于固定宽度字体的东西,数据就是这样一个例子。
  • @CalumYou 感谢您的帮助!我最初对 write.csv 不确定,因为我需要一次输出 1000 个这些表,这就是我使用 print 和 bash 脚本的目的,我不确定是否可以使用 write.csv 来做到这一点,但我会对此进行更多研究,因为这听起来可以解决我的问题!

标签: r


【解决方案1】:

我将使用您问题中暂时可用的数据:

txt <- "column1      column122   column3   column4   column5   column6 
 27013443     10.33132 6.622399e-10 2701000   10.33132 6.622399e-10 
column12     column123   column44  column55    column67   column18
 10.33132  6.622399e-10      0       2.3        0            1.1  "

spl <- strsplit(txt, "[\n\r]+")[[1]]
ind1 <- seq(1, length(spl), by = 2)
ind2 <- seq(2, length(spl), by = 2)
out <- read.table(header = TRUE, text = c(
  paste(spl[ind1], collapse = " "),
  paste(spl[ind2], collapse = " ")
))
out
#    column1 column122      column3 column4  column5      column6 column12    column123 column44 column55 column67 column18
# 1 27013443  10.33132 6.622399e-10 2701000 10.33132 6.622399e-10 10.33132 6.622399e-10        0      2.3        0      1.1

如果您对每列之间的空白数量有疑问,那么您可以先发制人地减少这些空白,将其转换为 CSV:

txt2 <- gsub("[[:space:]]+", ",", txt)
spl2 <- strsplit(txt2, "[\n\r]+")[[1]]
ind1 <- seq(1, length(spl), by = 2)
ind2 <- seq(2, length(spl), by = 2)
out2 <- read.csv(text = c(
  paste(spl2[ind1], collapse = " "),
  paste(spl2[ind2], collapse = " ")
))
out
#    column1 column122      column3 column4  column5      column6 column12    column123 column44 column55 column67 column18
# 1 27013443  10.33132 6.622399e-10 2701000 10.33132 6.622399e-10 10.33132 6.622399e-10        0      2.3        0      1.1

【讨论】:

  • user13097399,这是否解决了您的问题?如果没有,也许你可以填写我遗漏的地方。
  • @r2evans- 抱歉回复晚了- 非常感谢您的帮助!我现在就试试这个,让你知道:)
  • 如果可行,请accept the answer。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-03
  • 1970-01-01
  • 1970-01-01
  • 2012-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多