用R混合其他语言

时间:2011-10-25 16:13:32

标签: r unix

我使用R进行大部分统计分析。但是,清洁/处理数据,特别是在处理1Gb +的尺寸时,非常麻烦。所以我使用常见的UNIX工具。但我的问题是,是否可以在R会话中以交互方式运行它们?例如:假设file1是来自R进程的输出数据集,有100行。由此,对于我的下一个R流程,我需要第1列和第2列的特定子集file2,可以通过cutawk.轻松提取,因此工作流程如下:

Some R process => file1
cut --fields=1,2 <file1 | awk something something >file2
Next R process using file2

如果这是一个愚蠢的问题,请提前道歉。

5 个答案:

答案 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,并且所需的字段称为ab。如果它不是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-modebable以及使用不同编程的示例languages

除此之外,我认为org-mode和babel是编写纯R脚本的完美方式。

答案 4 :(得分:1)

在R中使用它之前准备数据是很常见的,我有很多用于Unix和Perl预处理的脚本,并且在不同的时间,为MySQL,MongoDB,Hadoop,C维护脚本/程序,等用于预处理。

但是,如果您在R中进行某些类型的预处理,您可能会获得更好的便携性。您可以尝试提出一些针对其中一些细节的新问题。例如,要将大量数据加载到内存映射文件中,我似乎要传播bigmemory。另一个例子可以在答案中找到(特别是JD Long的)to this question