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.
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.
Câu trả lời:
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 ...
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
Đú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
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.
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
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)