【问题标题】:Read a text file with variable number of columns to a list将具有可变列数的文本文件读取到列表中
【发布时间】:2011-01-30 13:23:36
【问题描述】:

我有一个这样的文件:

mylist.txt
234984  10354  41175 932711 426928
1693237   13462

此文件的每一行都有不同数量的元素,每行最少 1 个元素。 我想把它读成这样的列表:

> print(head(mylist,2))
[[1]]
[1] 234984  10354  41175 932711 426928

[[2]]
[1] 1693237   13462

【问题讨论】:

  • 由于您的示例列表项显示数字之间保留的空格,因此不清楚您是否希望每行是长字符串或数字向量。
  • 数字向量。我不确定它为什么显示空格。无论如何,aL3xa 的答案似乎效果很好。

标签: list file r


【解决方案1】:

假设空格是分隔符:

fc <- file("mylist.txt")
mylist <- strsplit(readLines(fc), " ")
close(fc)

编辑:

如果值被多个空格分隔(一种/或不一致的方式),您可以将分隔符与正则表达式匹配:

mylist.txt
234984   10354   41175 932711      426928
1693237               13462

fc <- file("mylist.txt")
mylist <- strsplit(readLines(fc), " +")
close(fc)

编辑#2

由于strsplit 返回字符串,您需要将数据转换为数字(这很简单):

mylist <- lapply(mylist, as.numeric)

【讨论】:

    【解决方案2】:

    一个可能的答案是首先读取一个充满 NA 的列表,然后像这样删除它们:

    l<-as.list( as.data.frame( t(read.table("mylist.txt",fill=TRUE,col.names=1:max(count.fields("mylist.txt"))))) )
    l<-lapply(l, function(x) x[!is.na(x)] )
    

    我想知道是否有更简单的方法。

    【讨论】:

      【解决方案3】:

      您可以使用lapply 而不是sapply 来简化第二行

          lapply(l, function(x)x[!is.na(x)])
      

      【讨论】:

      • 1.你需要它,否则 read.table 需要作为列数来读取文件前 5 行中的最大列数
      • @pms 啊,我的测试文件在第一行有最大的列数。我已经更新了我的答案。
      • 2.你是对的,我已经编辑了,谢谢你的评论。
      猜你喜欢
      • 1970-01-01
      • 2012-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      • 2015-05-07
      • 2021-06-20
      • 2020-08-10
      相关资源
      最近更新 更多