क्या R में फ़ाइल के बजाय स्ट्रिंग मान से पढ़ने के लिए read.csv का उपयोग करने का एक तरीका है?


82

मैं एक आर पैकेज लिख रहा हूं जहां आर कोड एक जावा एप्लिकेशन से बात करता है। Java एप्लिकेशन CSV स्वरूपित स्ट्रिंग को आउटपुट करता है और मैं चाहता हूं कि R कोड स्ट्रिंग को सीधे पढ़ने में सक्षम हो और इसे डेटा .frame में परिवर्तित कर सके।


क्या आप इसके बजाय rJava पैकेज का उपयोग कर सकते हैं?
जोशुआ उलरिच

हो सकता है कि आप allowEscapes (read.table में) के साथ फ़ाइड कर सकते हैं। बस सुनिश्चित करें कि जावा उत्पादन लाइनों को तोड़ने के लिए \ n का उपयोग करता है।
बजे रोमन लुसट्रिक

@ जोशुआ मैं अपने जावा प्रोग्राम से बात करने के लिए आरजेवा का उपयोग कर रहा हूं। मुझे लगता है कि मेरे भारी वजन जावा वस्तुओं को आर में बदलने से पहले इसे तार में बदलना अधिक कुशल है।
टोमी चेंग

टॉमी, जो आपको लगता है कि मैनुअल क्रमांकन साइमन की तुलना में अधिक कुशल है जो आरजेवा में डालते हैं? क्या आपने इसमें से कोई भी बेंचमार्क किया?
डिर्क एडल्डबुलेटेल

1
शायद कुशल गलत शब्द है। मेरा इनपुट हैशमैप जैसी वस्तुओं की एक सरणी है और मेरा आउटपुट एक आर डेटा है। मैंने rJava में कुछ भी नहीं देखा जो मुझे डेटा के रूप में जावा ऑब्जेक्ट का प्रतिनिधित्व करने देता है। इसलिए मैं अपनी वस्तुओं को एक स्ट्रिंग में प्रारूपित करता हूं और फिर इसे R data.frame में परिवर्तित करता हूं। इससे निपटने के किसी भी अधिक कुशल सुझाव की सराहना की जाएगी।
टॉमी चेंग

जवाबों:


117

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> 

हां, आर के लिए सहायता देखें 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
> 

ध्यान दें कि यह कुछ बनाने का एक सरल तरीका है लेकिन यह सभी डेटा के बार-बार पार्स करने के कारण महंगा भी है । जावा से आर तक पहुंचने के अन्य तरीके हैं, लेकिन यह आपको जल्दी से जाना चाहिए। दक्षता आगे आती है ...


8
अधिक हाल के आर संस्करणों में एक सरल तंत्र है, इस धागे में
@Adam

79

ध्यान दें कि आर के अब-वर्तमान संस्करणों में, आपको अब इसकी आवश्यकता नहीं है 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
मुझे पता है कि यह थोड़ी देर से ही सही, लेकिन शायद इसे स्वीकार किए गए उत्तर को संपादित करने के रूप में प्रस्तुत करना उपयोगी हो सकता है, क्योंकि यह संभावना नहीं है कि ओपी अब स्वीकार किए गए उत्तर को बदल देगा, फिर भी यह अब बेहतर उत्तर लगता है?
कहानियो

1
IMHO, ओपी को स्वीकार किए गए उत्तर को अस्वीकार करना चाहिए, और इस एक को स्वीकार करना चाहिए ...
मिशा

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

यह फ़ंक्शन डिर्क के उत्तर को सुविधाजनक रूप में लपेटता है। एसओ पर सवालों के जवाब देने के लिए यह शानदार है, जहां पूछने वाले ने सिर्फ ऑनस्क्रीन डेटा डंप किया है।

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

इसका उपयोग करने के लिए, पहले ऑनस्क्रीन डेटा कॉपी करें और अपने टेक्स्ट एडिटर में पेस्ट करें।

फू बार बाज
1 1 2
3 3 बी

अब इसके लिए text_to_table, उद्धरण और किसी भी अन्य तर्क के साथ लपेटें read.table

text_to_table("foo bar baz
1 2 a
3 4 b", header = TRUE)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.