Я пишу пакет R, в котором код R взаимодействует с приложением Java. Приложение Java выводит строку в формате CSV, и я хочу, чтобы код R мог напрямую читать строку и преобразовывать ее в data.frame.
Я пишу пакет R, в котором код R взаимодействует с приложением Java. Приложение Java выводит строку в формате CSV, и я хочу, чтобы код R мог напрямую читать строку и преобразовывать ее в data.frame.
Ответы:
Редактирование ответа семилетней давности: К настоящему времени это намного проще благодаря 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>
Да, посмотрите справку 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, но это должно помочь вам быстро. Далее идет эффективность ...
Обратите внимание, что в текущих версиях 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
Да. Например:
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
Предположим, у вас есть файл с именем 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
Это не идеально (измените имена столбцов ...), но это только начало.
Используя подход tidyverse, вы можете просто указать текстовое значение
library(readr)
read_csv(file = "col1, col2\nfoo, 1\nbar, 2")
# A tibble: 2 x 2
col1 col2
<chr> <dbl>
1 foo 1
2 bar 2
Эта функция превращает ответ Дирка в удобную форму. Он отлично подходит для ответов на вопросы о 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)