Подтвердить что ты не робот

Есть ли способ использовать read.csv для чтения из строкового значения, а не файла в R?

Я пишу R-пакет, где R-код говорит с Java-приложением. Приложение Java выводит строку в формате CSV, и я хочу, чтобы код R мог напрямую читать строку и преобразовывать ее в файл data.frame.

4b9b3361

Ответ 1

Да, посмотрите справку textConnection() - очень сильное понятие в R состоит в том, что по существу все читатели (например, read.table() и его варианты) получают доступ к этому объекту подключения, который может быть файлом, или удаленным URL-адресом, или трубку, поступающую из другого приложения, или... текст, как в вашем случае.

Тот же трюк используется для так называемых документов:

> lines <- "
+ flim,flam
+ 1.2,2.2
+ 77.1,3.14
+ "
> con <- textConnection(lines)
> data <- read.csv(con)
> close(con)
> data
  flim flam
1  1.2 2.20
2 77.1 3.14
> 

Обратите внимание, что это простой способ создания чего-либо, но он также является дорогостоящим из-за повторного анализа всех данных. Есть другие способы получить от Java до R, но это должно заставить вас идти быстро. Эффективность будет следующей...

Редактирование 7-летнего ответа: теперь это намного проще благодаря аргументу text=, который был добавлен в read.csv() и аналогичен:

R> data <- read.csv(text="flim,flam
+ 1.2,2.2
+ 77.1,3.14")
R> data
  flim flam
1  1.2 2.20
2 77.1 3.14
R> 

Ответ 2

Обратите внимание, что в текущих версиях R вам больше не понадобится textConnection(), можно просто сделать это:

> states.str='"State","Abbreviation"
+ "Alabama","AL"
+ "Alaska","AK"
+ "Arizona","AZ"
+ "Arkansas","AR"
+ "California","CA"'
> read.csv(text=states.str)
       State Abbreviation
1    Alabama           AL
2     Alaska           AK
3    Arizona           AZ
4   Arkansas           AR
5 California           CA

Ответ 3

Да. Например:

string <- "this,will,be\na,data,frame"
x <- read.csv(con <- textConnection(string), header=FALSE)
close(con)
#> x
#    V1   V2    V3
#1 this will    be
#2    a data frame

Ответ 4

Предположим, у вас есть файл с именем tommy.csv(да, образный, я знаю...), который содержит содержимое

col1 col2\n 1 1\n 2 2\n 3 3

где каждая строка разделяется escape-символом "\n".

Этот файл можно прочитать с помощью аргумента allowEscapes в read.table.

> read.table("tommy.csv", header = TRUE, allowEscapes = TRUE)

  col1 col2
1 col1 col2
2    1    1
3    2    2
4    3    3

Это не идеально (изменить имена столбцов...), но это начало.

Ответ 5

Эта функция завершает ответ Дирка в удобную форму. Это блестяще для ответа на вопросы о SO, где ассер просто сбросил данные на экране.

text_to_table <- function(text, ...)
{
   dfr <- read.table(tc <- textConnection(text), ...)
   close(tc)
   dfr
}

Чтобы использовать его, сначала скопируйте экранные данные и вставьте их в текстовый редактор.

foo bar baz
1 2 a
3 4 b

Теперь оберните его text_to_table, кавычками и любыми другими аргументами для read.table.

text_to_table("foo bar baz
1 2 a
3 4 b", header = TRUE)