【问题标题】:R read.table() from pc vs macR read.table() 从 pc vs mac
【发布时间】:2016-04-28 07:04:44
【问题描述】:

如果您是 Mac 用户并运行以下代码,您将获得一个包含 173,962 行的数据框。如果您是 Windows 用户,您的数据集将只有 8,999 行。谁能告诉我为什么?我怎样才能在我的 PC 上将数据读入 R?

这是我的数据:.txt file

d<-read.table("Stream4_1.13.16t.txt", sep="", skip=10, quote = "", fill=T, header=F) 

我正在处理由独特且不常见的软件(无源集成转发器系统,PIT)创建的检测数据,该软件有时会“打乱”一行数据并产生类似于 Wingdings 字体中的奇怪字符。我的文件是空格分隔的文本文件。我有一种预感,这些字符可能会导致读取问题,但为什么 Mac 会有所不同?

为了检查是否需要更改编码,我运行了以下命令:

d<-read.table("Stream4_1.13.16t.txt", sep="", fileEncoding="UTF-8", skip=10, quote = "", fill=T, header=F)
d<-read.table("Stream4_1.13.16t.txt", sep="", fileEncoding="latin1", skip=10, quote = "", fill=T, header=F)

得到了这个:警告信息: 在 scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings, : 在输入连接“Stream4_1.13.16t.txt”上发现无效输入

【问题讨论】:

  • ?read.table 中的“注释”部分讨论了文本文件编码和操作系统之间的交互。也许值得一看;我自己也不知道答案。
  • 谢谢,弗兰克。我玩了一下编码,但在那里找不到解决方案。
  • 我记得我曾经遇到过类似的问题,它与使用参数“wb”打开文件以二进制模式写入有关。请参阅连接文档 (?connections)。
  • 我认为你应该先用参数 open"=wb" 打开与文件的连接,然后将该对象传递给 read.table 让我知道它是否有效
  • 你应该在 windows 中这样做

标签: r windows macos


【解决方案1】:

老实说,我不知道答案(尽管我下面的建议可能有价值)并且我只使用答案框,因为此评论太大并且需要格式化容量。 (我是 SO 受访者,他告诉您此文件在 Mac 上很容易阅读。)这是该文件的顶部(使用您之前问题中下载的数据):

=~=~=~=~=~=~=~=~=~=~=~= PuTTY log 2016.01.13 16:42:02 =~=~=~=~=~=~=~=~=~=~=~=
u uh
  NEW  2016-01-08 16:27:25.52  171953
                        Total  171953

>up
Upload #1
Reader: S4  Site: AA
--------- upload 1 start ---------
E 2024-01-13 15:30:52.11 reader not responding
D 2016-01-08 16:27:34.83 00:00:00.38 HA      900_226000745066 A2    4    77
D 2016-01-08 16:27:34.41 00:00:00.00 HA      900_226000745066 A4    1   218
D 2016-01-08 16:27:34.59 00:00:00.62 HA      900_226000745066 A4    6     1
D 2016-01-08 16:27:34.41 00:00:00.00 HA      900_226000745066 A2    1    35
D 2016-01-08 16:27:34.59 00:00:00.62 HA      900_226000745066 A2    6     1
# snipped a bunch of lines
D 2016-01-08 16:29:26.86 00:00:00.86 HA      900_226000745060 A2    8    85
D 2016-01-08 16:29:28.21 00:00:00.32 HA      900_226000745060 A2    4     3
D 2016-01-08 16:29:28.70 00:00:00.12 HA      900_226000745060 A2    2     1
E 2016-01-08 16:36:00.00 date/time changed. Was 2016-01-08 16:29:37.80
D 2016-01-08 16:36:06.95 00:00:00.26 HA      900_226000745018 A2    3   136
D 2016-01-08 16:36:07.63 00:00:00.12 HA      900_226000745060 A2    2     3
D 2016-01-08 16:36:09.41 00:00:00.25 HA      900_226000745060 A2    3    13
D 2016-01-08 16:36:17.41 00:00:00.48 HA      900_226000745060 A2    5    65
D 2016-01-08 22:09:05.68 00:00:00.00 HA 00000 0 900 226000745000 2260007450?0 A4    1     0
D 2016-01-10 18:16:56.61 00:00:00.00 HA 00000 0 900 22600070 900 2260007450;1 A4    1     1
D 2016-01-08 16:36:30.62 00:00:00.19 HA      900_226000745060 A2    3     7
D 2016-01-08 16:36:31.04 00:00:00.31 HA      900_226000745060 A2    4     1
D 2016-01-08 16:36:33.02 00:00:00.12 HA      900_226000745066 A2    2    13
D 2016-01-08 16:36:41.07 00:00:00.13 HA      900_226000745066 A2    2    65
D 2016-01-10 15:38:39.74 00:00:00.00 HA 00000 0 900 22600074 900 2260007450?6 A2    1     1
D 2016-01-08 16:36:42.19 00:00:00.00 HA      900_226000745066 A2    1     1
D 2016-01-08 16:36:54.03 00:00:00.73 HA      900_226000745060 A2    7   101
D 2016-01-08 16:36:55.14 00:00:00.24 HA      900_226000745060 A2    3     2
D 2016-01-08 16:36:55.56 00:00:00.00 HA      900_226000745060 A2    1     1
D 2016-01-08 16:36:57.96 00:00:00.00 HA      900_226000745060 A2    1    19

试图用 read.table 读取这个文件是一个注定的希望。对于以“D”开头的带有数据的行,它是固定宽度格式。更明智的方法(一旦你弄清楚编码和字体混淆)是使用readLines 创建一个txt_obj,使用grepl("^D ", txt_obj) 创建一个选择向量,然后使用 read.fwf 进行解析。

【讨论】:

    【解决方案2】:

    我从建议使用 readr 包的外部资源获得帮助。 下面的代码工作并导入所有数据行。

    library(readr)
    d<-read_table("Stream4_1.13.16t.txt", col_names = F, na = "NA", skip = 10)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-15
      • 1970-01-01
      相关资源
      最近更新 更多