我有两个不同的文件夹,"big_data"(一个约2GB的文件)和另一个"small_data"(约6个文件,总共约150 MB)。我想将包含多个标题行和空格的数据文件上载到R。文件的结构如下所示
# File name
#
#@ 1 "Some text" "aa"
#@ 2 "Some text" "bb"
#@ 3 "Some text" "cc"
#@ 4 "Some text" "dd"
#@ 5 "Some text" "ee"
#@ 6 "Some text" "ff"
#
#
#
#
0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
1.000000e-03 3.727051e-04 2.532203e-04 4.736003e-04 3.727051e-07 0.000000e+00
2.000000e-03 2.266785e-03 1.540081e-03 2.880429e-03 2.639490e-06 0.000000e+00
3.000000e-03 7.538553e-03 5.121786e-03 9.579321e-03 1.017804e-05 0.000000e+00
4.000000e-03 1.838835e-02 1.249329e-02 2.336627e-02 2.856639e-05 0.000000e+00
5.000000e-03 3.703296e-02 2.516073e-02 4.705817e-02 6.559935e-05 0.000000e+00
6.000000e-03 2.266785e-03 1.540081e-03 2.880429e-03 2.639490e-06 0.000000e+00
7.000000e-03 7.538553e-03 5.121786e-03 9.579321e-03 1.017804e-05 0.000000e+00
8.000000e-03 1.838835e-02 1.249329e-02 2.336627e-02 2.856639e-05 0.000000e+00
9.000000e-03 3.703296e-02 2.516073e-02 4.705817e-02 6.559935e-05 0.000000e+00
如您所见,它包含10行和6列。"#@"后面的文本是列名。我编写了以下函数从用户指定的文件夹导入数据。它导入数据,跳过包含标题文本的行,提取列名并删除该文件夹中所有文件的NA列。()如果"用户指定的文件夹"为"small_data"且fread如果"user_specified_folder"为"big_data",则返回()。它适用于前者,但不适用于后者。fread没有错误(),R会话内存约为6 GB,但导入的文件大小仅为15 kB(仅列名)。
x一个一个一个一个x一个一个二个x
如何让上面的代码与fread()一起工作?
2条答案
按热度按时间x4shl7ld1#
下面是我阅读这些文件的方式:
zz2j4svz2#
我建议在
fread()
中使用cmd
-参数,以便在阅读之前预处理文件。从功能上讲,它使用fread读取shell命令的输出,在本例中,我们使用类似grep的命令(findstr在所有现代Windows(我使用的是W10)版本中都有)只读取我们想要读取的行。
在windows上,它与
findstr
一起工作,在 *nix环境下,你必须修改下面的代码以使用grep
或awk
。此解决方案可能存在的缺点:根据所选的shell命令,它可能会降低代码在操作系统之间的可移植性。
使用的示例数据