R'deki bir dosyadan ziyade bir dize değerinden okumak için read.csv'yi kullanmanın bir yolu var mı?


82

R kodunun bir Java uygulamasıyla konuştuğu bir R paketi yazıyorum. Java uygulaması, CSV formatlı bir dize çıkarır ve R kodunun dizeyi doğrudan okuyup bir data.frame'e dönüştürebilmesini istiyorum.


Bunun yerine rJava paketini kullanabilir misiniz?
Joshua Ulrich

Belki allowEscapes ile oynayabilirsiniz (read.table'da). Sadece java çıktısının satırları kesmek için \ n kullandığından emin olun.
Roman Luštrik

@Joshua Java programımla konuşmak için rJava kullanıyorum. Bence ağır java nesnelerimi R'ye geçirmeden önce dizelere dönüştürmenin daha verimli olduğunu düşünüyorum.
tommy chheng

Tommy, manüel serileştirmenin Simon'ın rJava'ya koyduğundan daha verimli olduğunu nereden biliyorsun? Bunlardan herhangi birini karşılaştırdınız mı?
Dirk Eddelbuettel

1
belki verimli yanlış kelimedir. Girdiğim bir hashmap benzeri nesneler dizisi ve çıktım bir R data.frame. RJava'da bir java nesnesini data.frame olarak temsil etmeme izin veren hiçbir şey görmedim, bu yüzden nesnelerimi bir dizeye biçimlendirip sonra bir R data.frame'e dönüştürüyorum. bununla başa çıkmanın daha verimli önerileri takdir edilecektir.
tommy chheng

Yanıtlar:


117

7 yıllık bir cevabı düzenlemek: Şimdiye kadartext= , eklenen read.csv()ve benzeri argüman sayesinde bu çok daha basit :

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> 

Evet, yardıma bakın textConnection()- R'deki çok güçlü fikir, esasen tüm okuyucuların (örneğin read.table()ve varyantları gibi) bir dosya veya uzak bir URL veya başka bir uygulamadan gelen bir boru olabilen bu bağlantı nesnesine erişmesidir. veya ... sizin durumunuzdaki gibi bir metin.

Aynı numara burada sözde belgeler için kullanılır:

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

Bunun bir şeyler inşa etmenin basit bir yolu olduğunu, ancak tüm verilerin tekrar tekrar ayrıştırılması nedeniyle de maliyetli olduğunu unutmayın. Java'dan R'ye gitmenin başka yolları da var, ancak bu hızlı bir şekilde ilerlemenizi sağlayacaktır. Verimlilik sonra gelir ...


8
Daha yeni R sürümleri daha basit bir mekanizmaya sahiptir, bu konudaki @Adam Bradley'in cevabına bakın: stackoverflow.com/a/16349171/17523
Boris Gorelik

79

R'nin şu anki sürümlerinde artık ihtiyacınız olmadığına dikkat edin textConnection(), bunu basitçe yapmanız mümkün:

> 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
Bunun kendisinin biraz geç olduğunu biliyorum ama - belki de bunu kabul edilen cevaba bir düzeltme olarak göndermek faydalı olabilir, çünkü OP'nin artık kabul edilen cevabı değiştirmesi pek olası değildir, ancak bu şimdi daha iyi bir cevap gibi görünüyor?
gizleme

1
IMHO, OP kabul edilen cevabı ve bunu kabul etmeli ...
Mischa

4

Evet. Örneğin:

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 adında (evet, yaratıcı, biliyorum ...) ve içeriğine sahip bir dosyanız olduğunu varsayalım.

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

burada her satır bir çıkış karakteri "\ n" ile ayrılmıştır.

Bu dosya, içindeki allowEscapesargüman yardımıyla okunabilir read.table.

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

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

Mükemmel değil (sütun adlarını değiştirin ...), ama bu bir başlangıç.


1

Düzenli bir yaklaşım kullanarak, yalnızca bir metin değeri belirtebilirsiniz

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

Bu işlev, Dirk'in yanıtını uygun bir biçime dönüştürür. Soruyu soran kişinin ekrandaki verileri döktüğü SO'daki soruları yanıtlamak için harika.

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

Kullanmak için önce ekrandaki verileri kopyalayın ve metin düzenleyicinize yapıştırın.

foo bar baz
1 2 a
3 4 b

Şimdi text_to_table, tırnak işaretleri ve diğer argümanlarla sarın read.table.

text_to_table("foo bar baz
1 2 a
3 4 b", header = TRUE)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.