R의 파일이 아닌 문자열 값에서 읽기 위해 read.csv를 사용하는 방법이 있습니까?


82

R 코드가 Java 애플리케이션과 통신하는 R 패키지를 작성 중입니다. Java 애플리케이션은 CSV 형식의 문자열을 출력하고 R 코드가 문자열을 직접 읽고이를 data.frame으로 변환 할 수 있기를 원합니다.


대신 rJava 패키지를 사용할 수 있습니까?
Joshua Ulrich

allowEscapes (read.table에서)를 가지고 놀 수 있습니다. 자바 출력이 \ n을 사용하여 줄을 나누는 지 확인하십시오.
Roman Luštrik

@Joshua 저는 rJava를 사용하여 Java 프로그램과 통신하고 있습니다. 내 무거운 자바 객체를 R로 전달하기 전에 먼저 문자열로 변환하는 것이 더 효율적이라고 생각합니다.
tommy chheng

Tommy, Simon이 rJava에 넣은 것보다 수동 직렬화가 더 효율적이라고 생각하는 이유는 무엇입니까? 이 중 벤치마킹 했습니까?
Dirk Eddelbuettel

1
아마도 효율적인 것은 잘못된 단어입니다. 내 입력은 해시 맵과 같은 객체의 배열이고 내 출력은 R data.frame입니다. rJava에서 java 객체를 data.frame으로 표현할 수있는 어떤 것도 보지 못했기 때문에 객체를 문자열로 포맷 한 다음 R data.frame으로 변환했습니다. 이를 처리하는 더 효율적인 제안을 주시면 감사하겠습니다.
tommy chheng

답변:


115

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> 

예, 도움말을보십시오. R textConnection()매우 강력한 개념은 본질적으로 모든 독자 (예 : 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로 이동하는 다른 방법이 있지만 이렇게하면 빠르게 진행할 수 있습니다. 효율성이 다음으로 나옵니다 ...


8
최신 R 버전에는 더 간단한 메커니즘이 있습니다.이 스레드에서 @Adam Bradley의 답변을 참조하십시오. stackoverflow.com/a/16349171/17523
Boris Gorelik

79

현재 최신 버전의 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

5
나는 이것이 조금 늦었다는 것을 알고 있지만-OP가 이제 수락 된 답변을 변경할 가능성이 없기 때문에 수락 된 답변에 대한 편집으로 제출하는 것이 유용 할 수 있지만 이제 더 나은 답변으로 보입니다.
난독 화 '

1
이럴은 영업 이익이 ... 허용 대답을 수락 취소하고,이 일을 받아 들여야
미샤

4

예. 예를 들면 :

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

1

tommy.csv (예, 상상력이 풍부합니다 ...)라는 파일이 있다고 가정합니다.

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

여기서 각 줄은 이스케이프 문자 "\ 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

완벽하지는 않지만 (열 이름 수정 ...) 시작일뿐입니다.


1

깔끔한 접근 방식을 사용하면 텍스트 값만 지정할 수 있습니다.

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

0

이 함수는 Dirk의 대답을 편리한 형식으로 포장합니다. 질문자가 화면에 데이터를 방금 덤프 한 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)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.