【问题标题】:Mixing other languages with R将其他语言与 R 混合
【发布时间】:2011-12-15 02:13:55
【问题描述】:

我的大部分统计分析都使用 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

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

【问题讨论】:

  • 请参阅?system,了解如何在 R 中运行 shell 命令。
  • @Joshua:在我看来,将此作为答案发布会是更好的做法。这将导致 [r] 问题的显示有一个非零答案并允许它被接受。
  • 也许吧。发布一个超简短的答案或我没有详细解释的答案,我总是感到有点内疚,所以我把它作为评论留下,让其他人(或 OP)重新发布更多细节作为答案.. .

标签: r unix


【解决方案1】:

试试这个(如果需要,添加其他 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")

【讨论】:

  • 很好的答案,所有。我希望我能检查格洛腾迪克和德克的回答是否被接受。非常感谢。
【解决方案2】:

我想您可能正在寻找将 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)

【讨论】:

  • 我认为litter 是一个不同的包。 :) 那个容易堵塞管道。
【解决方案3】:

请参阅?system,了解如何在 R 中运行 shell 命令。

【讨论】:

    【解决方案4】:

    保持文学编程的传统,使用例如org-mode 和 org-babel 将完美地完成这项工作:

    您可以在一个脚本中组合多种不同的编程语言并执行,然后按顺序分离,导出结果或代码,...

    有点像sweave,只是代码块可以通过python、bash、R、sql等众多。查看:org-modebable 以及使用不同编程的示例languages

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-29
        • 1970-01-01
        • 2016-05-06
        相关资源
        最近更新 更多