Python或awk/sed用于清洗数据

26

我使用R进行数据分析,感到非常满意。但是数据清理可能需要更简便一些。因此,我正在考虑学习另一种适用于这项任务的语言。具体而言,我正在寻找一种工具,可用于获取原始数据,删除不必要的变量或观察结果,并将其格式化以便在R中轻松加载。内容主要包括数字和字符串数据,而不是多行文本。

我正在考虑awk/sed组合与Python。 (我知道Perl是另一个选择,但如果我要学习另一种完整的语言,Python似乎是更好、更可扩展的选择。)

sed/awk的优点是可以更快地学习。缺点是这种组合不如Python可扩展。 实际上,如果我学习了Python,我可能会想象出一些“任务膨胀”的情况,这也是可以接受的,但却不是我的目标。

我考虑的另一个问题是应用于大型数据集的问题。据我所知,awk / sed逐行操作,而Python通常会将所有数据存入内存中。这可能是awk/sed的另一个优势。

有其他我忽略的问题吗?您能提供的任何建议都将不胜感激。 (我包括了R标签,以便R用户提供其清理建议。)


你所说的“cleaning”,是指剪裁异常值、恢复一致性还是其他什么?而你所说的“data”,主要是指数字或字符串,还是简单地指文本?对我来说,当前问题的目标过于笼统。 - nye17
2
我个人主要使用Python,但如果纯粹是文本数据集的操作,作为R的数据接口,我强烈建议使用Perl,因为它具有强大的正则表达式和处理文本的灵活性。 - nye17
1
我想知道我们可以用Perl/Python/Ruby/Sed/Awk等编程语言做什么,但是在R中无法实现的功能。 - kohske
1
Python通常不会将所有数据加载到内存中,除非您明确要这样做。 - donkopotamus
1
@kohske,问题不在于能否做到,而在于做起来是否容易。每种语言都有其优点和缺点,适用于一定的使用场景。例如,R非常适合交互式数据操作,但我不会用它来构建大规模的数据集成和过滤管道...但是它也可以做到。 - Reece
显示剩余2条评论
6个回答

15

我不想破坏你的冒险心态,但我会说不,以下是原因:

  • R语言向量化处理,而sed/awk则不支持
  • R语言已经包含了Perl正则表达式和扩展正则表达式
  • 如果需要,R语言可以更容易地使用统计学函数(比如插补)
  • R语言可以进行可视化、汇总等操作

最重要的是:你已经知道如何使用R语言了

当然,sed/awk 对于小型程序或单行程序非常好用,Python语言也很不错。但我建议你继续使用R语言。


4
我认为他不是考虑放弃 R,而是要对它进行补充。 - Karl

10

我经常使用Python和Perl。我相当熟悉sed,曾经也经常使用awk。我断断续续地使用过R。Perl在数据转换功能和速度方面是这些语言中最好的。

  • Perl本质上可以完成sed和awk的所有功能,并且还有更多功能。事实上,perl附带的a2p和s2p工具可以将awk和sed脚本转换为Perl。
  • Perl已经被包含在大多数Linux/Unix系统中。在这种情况下,学习sed和awk是有充分理由的。但是现在这个理由已经不再存在了。
  • Perl有丰富的模块库,提供比awk或sed更强大的功能。例如,这些模块使得能够快速处理反向互补DNA序列、计算统计数据、解析CSV文件或计算MD5值等。详见http://cpan.org/
  • Perl与sed和awk一样简洁。对于像我这样的人(以及我猜测的你),在命令行上快速转换数据是一个很大的优势。Python在命令行使用时太啰嗦了。

说实话,我真的不知道为什么有人会选择学习sed和awk而不是Perl。

声明一下,我并不是“Perl迷”。我喜欢它作为瑞士军刀,而不是作为一种宗教。


2
从公正的编码背景进行全面比较,加1分。 - nye17
+1 给 Perl。虽然 Python 可能更易读,但 Perl 在速度和紧凑性方面始终胜过它。而且命令行选项确实是一大福音。 - Joris Meys
“每个Unix系统都有Perl”这个论点同样适用于sed和awk,如果你需要(发抖)在Windows上工作,这两者更容易获取。这让我们回到了我的“只需使用R”的想法,因为Charlie显然会在Windows上使用R。我曾经用Perl编写过很多数据过滤器,但现在完全转向了R。 - Dirk Eddelbuettel
一般来说,这是一个很好的回答,但问题中列出了简单性作为一个考虑因素。虽然Perl无疑更强大,但如果sed/awk能够满足他的所有需求,那么这可能是“人们选择学习sed和awk而不是Perl”的原因。 - user287424

6
我会推荐使用sed/awk以及其他在UNIX系统中可用的命令行工具:comm、tr、sort、cut、join、grep和内置shell功能,如循环等。您真的不需要学习另一种编程语言,因为R可以像其他流行的脚本语言一样处理数据操作,甚至更好。

Jeff说得很有道理:当使用管道将命令行工具粘合在一起时,像他提到的这些工具可以非常快速和强大地对数据进行切片和切块。Perl是这些工具的补充(而不是替代品)。请参阅GNU coreutils手册http://www.gnu.org/s/coreutils/manual/html_node/index.html以获取摘要。 - Reece
而且更好的是,如果你使用来自 Jeff 和 Dirk 的精彩 r 二进制文件,R 可以使用相同的管道。 因此,回到使用 R :) - Dirk Eddelbuettel
问询者没有指定平台,但对于大多数使用 Windows 的人来说,这可能不是一个好的方法。将 Unix 工具转移到 Windows 环境并不是没有问题的。 - user287424

3
我建议使用适合处理数据文件的编程语言,如Python、Perl或Ruby,而不是短期解决方案sed/awk。我认为所有数据分析师都需要至少三种语言;我使用C进行繁重计算,perl用于处理数据文件,R用于交互式分析和图形展示。
在Python变得流行之前,我学习了Perl。我听说Ruby也很不错,你可以尝试一下。
对于任何一种语言,你都可以逐行处理文件;Python不需要提前读取整个文件。

2
当然可以,但是要注意的是,"C++可能比C更好的C语言",同样地,Python的粉丝们也认为它比Perl更好。但作为一个普遍规律,掌握R、一门脚本语言和一门现代可移植编译语言是一个不错的选择。 - Dirk Eddelbuettel
@DirkEddelbuettel 确实,就编程而言,我被困在90年代末了;我担心学生们会像我看待Fortran程序员一样看待我。 - Karl

1
我建议使用'awk'来进行此类处理。
假设您只是在简单文本文件中搜索/拒绝无效观测结果。
awk在这个任务上非常快速,并且编程非常简单。
如果您需要执行更复杂的操作,则可以选择其他方法。
如果您不介意性能损失,Python也是一种可能性。 "rpy"库可用于紧密集成python和R组件。

1

我同意Dirk的观点。我也考虑过这个问题,尝试使用了其他编程语言。但最终我还是惊讶地发现,更有经验的用户使用R时能够做到更多。像ddplyplyr这样的包可能对你非常有趣。话虽如此,SQL在数据操作方面经常给我带来了帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接