我使用R进行大部分统计分析。但是,清洁/处理数据,特别是在处理1Gb +的尺寸时,非常麻烦。所以我使用常见的UNIX工具。但我的问题是,是否可以在R会话中以交互方式运行它们?例如:假设file1
是来自R进程的输出数据集,有100行。由此,对于我的下一个R流程,我需要第1列和第2列的特定子集file2
,可以通过cut
和awk.
轻松提取,因此工作流程如下:
Some R process => file1
cut --fields=1,2 <file1 | awk something something >file2
Next R process using file2
如果这是一个愚蠢的问题,请提前道歉。
答案 0 :(得分:8)
尝试此操作(如果需要,添加其他read.table
参数):
# 1
DF <- read.table(pipe("cut -fields=1,2 < data.txt| awk something_else"))
或纯粹的R:
# 2
DF <- read.table("data.txt")[1:2]
或者甚至没有读取不需要的字段,假设有4个字段:
# 3
DF <- read.table("data.txt", colClasses = c(NA, NA, "NULL", "NULL"))
对于我们知道我们想要前两个字段但不知道有多少其他字段的情况,可以修改最后一行:
# 3a
n <- count.fields("data.txt")[1]
read.table("data.txt", header = TRUE, colClasses = c(NA, NA, rep("NULL", n-2)))
可以使用sqldf包。在此示例中,我们假设一个csv文件data.csv
,并且所需的字段称为a
和b
。如果它不是csv文件,那么使用read.csv.sql
的适当参数来指定其他分隔符等:
# 4
library(sqldf)
DF <- read.csv.sql("data.csv", sql = "select a, b from file")
答案 1 :(得分:6)
我认为您可能正在寻找将{R}集成到Unix命令行管道中的littler。
这是一个计算/bin
的文件大小分布的简单示例:
edd@max:~/svn/littler/examples$ ls -l /bin/ | awk '{print $5}' | ./fsizes.r
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
4 5736 23580 61180 55820 1965000 1
The decimal point is 5 digit(s) to the right of the |
0 | 00000000000000000000000000000000111111111111111111111111111122222222+36
1 | 01111112233459
2 | 3
3 | 15
4 |
5 |
6 |
7 |
8 |
9 | 5
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 | 6
edd@max:~/svn/littler/examples$
这需要三行:
edd@max:~/svn/littler/examples$ cat fsizes.r
#!/usr/bin/r -i
fsizes <- as.integer(readLines())
print(summary(fsizes))
stem(fsizes)
答案 2 :(得分:3)
有关如何从R中运行shell命令的信息,请参阅?system
。
答案 3 :(得分:3)
保持文学编程的传统,使用例如org-mode和org-babel将完美地完成这项工作:
您可以在一个脚本中组合多种不同的编程语言,然后执行,然后依次单独导出结果或代码,...
它有点像sweave,只有代码块可以通过python,bash,R,sql和许多其他。检查:org-mode和bable以及使用不同编程的示例languages
除此之外,我认为org-mode和babel是编写纯R脚本的完美方式。
答案 4 :(得分:1)
在R中使用它之前准备数据是很常见的,我有很多用于Unix和Perl预处理的脚本,并且在不同的时间,为MySQL,MongoDB,Hadoop,C维护脚本/程序,等用于预处理。
但是,如果您在R中进行某些类型的预处理,您可能会获得更好的便携性。您可以尝试提出一些针对其中一些细节的新问题。例如,要将大量数据加载到内存映射文件中,我似乎要传播bigmemory
。另一个例子可以在答案中找到(特别是JD Long的)to this question。