Смешивание других языков с R - PullRequest
4 голосов
/ 25 октября 2011

Я использую R для большей части моего статистического анализа.Однако очистка / обработка данных, особенно когда речь идет о размерах 1 Гб +, довольно громоздка.Поэтому для этого я использую стандартные инструменты 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

Заранее извиняюсь, если это глупый вопрос.

Ответы [ 5 ]

8 голосов
/ 25 октября 2011

Попробуйте это (добавив другие 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")
6 голосов
/ 25 октября 2011

Думаю, вы ищете littler , который интегрирует R в конвейеры командной строки Unix.

Вот простой пример вычисления распределения размера файла /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)
3 голосов
/ 25 октября 2011

Придерживаясь традиций грамотного программирования, используя, например, org-mode и org-babel, вы отлично справитесь с работой:

Вы можете объединить несколько разных языков программирования в одном скрипте и выполнять затем по отдельности, последовательно,экспортировать результаты или код, ...

Это немного похоже на sweave, только то, что блоки кода могут быть написаны на python, bash, R, sql и многих других.Проверьте: режим оргкомитета и bable и пример использования различных программ языков

Кроме этого, я думаю, что режим орг иbabel - идеальный способ написания даже чистых R-сценариев.

3 голосов
/ 25 октября 2011

См. ?system, как запускать команды оболочки из R.

1 голос
/ 25 октября 2011

Подготовка данных перед работой с ними в R довольно распространена, и у меня есть много сценариев для предварительной обработки Unix и Perl, и в разное время поддерживались сценарии / программы для MySQL, MongoDB, Hadoop, C, и т. д. для предварительной обработки.

Однако вы можете получить больший пробег для переносимости, если вы выполните некоторые виды предварительной обработки в R. Вы можете попробовать задать новые вопросы, сосредоточенные на некоторых из этих особенностей. Например, чтобы загрузить большие объемы данных в файлы с отображенной памятью, я, кажется, проповедую bigmemory. Другой пример можно найти в ответах (особенно Д.Д. Лонга) на этот вопрос .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...