Có cách nào để sử dụng read.csv để đọc từ một giá trị chuỗi thay vì một tệp trong R không?


82

Tôi đang viết một gói R trong đó mã R nói chuyện với một ứng dụng Java. Ứng dụng Java xuất ra một chuỗi có định dạng CSV và tôi muốn mã R có thể đọc trực tiếp chuỗi và chuyển đổi nó thành data.frame.


Bạn có thể sử dụng gói rJava thay thế không?
Joshua Ulrich

Có lẽ bạn có thể thử nghiệm với allowEscapes (trong read.table). Chỉ cần đảm bảo rằng đầu ra java sử dụng \ n để ngắt dòng.
Roman Luštrik

@Joshua Tôi đang sử dụng rJava để nói chuyện với chương trình Java của mình. Tôi nghĩ đó là hiệu quả hơn để chuyển đổi đối tượng java cân nặng của tôi để dây đầu tiên trước khi đi qua nó vào R.
tommy Chheng

Tommy, điều gì khiến bạn nghĩ rằng tuần tự hóa thủ công hiệu quả hơn những gì Simon đưa vào rJava? Bạn có đánh giá điểm chuẩn nào trong số này không?
Dirk Eddelbuettel 14/10/10

1
có thể hiệu quả là từ sai. Đầu vào của tôi là một mảng các đối tượng giống như hashmap và đầu ra của tôi là một khung R data.frame. Tôi không thấy bất kỳ thứ gì trong rJava cho phép tôi biểu diễn một đối tượng java dưới dạng data.frame, vì vậy tôi định dạng các đối tượng của mình thành một chuỗi và sau đó chuyển đổi nó thành R data.frame. bất kỳ đề xuất hiệu quả hơn để đối phó với điều này sẽ được đánh giá cao.
tommy chheng

Câu trả lời:


115

Chỉnh sửa câu trả lời cho trẻ 7 tuổi: Hiện tại, điều này đơn giản hơn nhiều nhờ vào text=đối số đã được thêm vào read.csv()và giống nhau:

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> 

Có, hãy xem phần trợ giúp textConnection()- khái niệm rất mạnh mẽ trong R là về cơ bản tất cả các trình đọc (chẳng hạn như read.table()và các biến thể của nó) đều truy cập đối tượng kết nối này có thể là một tệp hoặc một URL từ xa hoặc một đường dẫn đến từ một ứng dụng khác , hoặc ... một số văn bản như trong trường hợp của bạn.

Thủ thuật tương tự được sử dụng cho cái gọi là tài liệu ở đây:

> 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
> 

Lưu ý rằng đây là một cách đơn giản để xây dựng một thứ gì đó nhưng nó cũng tốn kém do phải phân tích cú pháp lặp lại tất cả dữ liệu. Có nhiều cách khác để chuyển từ Java sang R, nhưng cách này sẽ giúp bạn nhanh chóng. Hiệu quả đến tiếp theo ...


8
Phiên bản R gần đây có một cơ chế đơn giản hơn, xem câu trả lời của @ Adam Bradley trong luồng này: stackoverflow.com/a/16349171/17523
Boris Gorelik

79

Lưu ý rằng trong các phiên bản hiện tại của R, bạn không cần nữa textConnection(), bạn có thể chỉ cần thực hiện điều này:

> 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
Tôi biết bản thân điều này là hơi muộn nhưng - có lẽ có thể hữu ích nếu gửi nó dưới dạng một bản chỉnh sửa cho câu trả lời được chấp nhận, vì bây giờ OP sẽ không thay đổi câu trả lời được chấp nhận, nhưng đây có vẻ là câu trả lời tốt hơn?
obfuscation

1
IMHO, OP nên unaccept câu trả lời được chấp nhận, và chấp nhận điều này một ...
Mischa

4

Đúng. Ví dụ:

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

Giả sử bạn có một tệp tên là tommy.csv (vâng, giàu trí tưởng tượng, tôi biết ...) có nội dung

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

trong đó mỗi dòng được phân tách bằng ký tự thoát "\ n".

Tệp này có thể được đọc với sự trợ giúp của allowEscapesđối số trong read.table.

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

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

Nó không hoàn hảo (sửa đổi tên cột ...), nhưng đó là một sự khởi đầu.


1

Sử dụng phương pháp ngăn nắp, bạn có thể chỉ định một giá trị văn bản

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

Hàm này kết hợp câu trả lời của Dirk thành một dạng thuận tiện. Thật tuyệt vời khi trả lời các câu hỏi trên SO, nơi người hỏi vừa kết xuất dữ liệu trên màn hình.

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

Để sử dụng nó, trước tiên hãy sao chép dữ liệu trên màn hình và dán vào trình soạn thảo văn bản của bạn.

thanh foo baz
1 2 a
3 4 b

Bây giờ bọc nó bằng text_to_table, dấu ngoặc kép và bất kỳ đối số nào khác cho read.table.

text_to_table("foo bar baz
1 2 a
3 4 b", header = TRUE)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.