सबसे उपयोगी आर चाल क्या है? [बन्द है]


88

R के लिए कुछ और टिप्स और ट्रिक्स साझा करने के लिए , आपकी एकल-उपयोगी सुविधा या ट्रिक क्या है? चतुर वैश्वीकरण? डेटा इनपुट / आउटपुट? विज़ुअलाइज़ेशन और ग्राफिक्स? सांख्यिकीय विश्लेषण? विशेष कार्य? इंटरैक्टिव वातावरण ही?

प्रति पोस्ट एक आइटम, और हम देखेंगे कि क्या हमें वोट के माध्यम से विजेता मिलता है।

[संपादित करें २५-अगस्त २०० after]: इसलिए एक सप्ताह के बाद, ऐसा लगता है कि साधारण str()ने चुनाव जीत लिया। जैसा कि मैं यह सलाह देना चाहता हूं कि यह स्वयं, यह स्वीकार करने का एक आसान उत्तर है।


8
@ डर्क: "सामुदायिक विकी" का अर्थ "समुदाय के स्वामित्व वाला" है, यह "पोल प्रश्न" का पर्याय नहीं है। समुदाय विकि पुलिस की न सुनें।
जूलियट


8
सीडब्ल्यू ने फिर बदमाशी की। मैं आपका मेटा-SO देखूंगा
ars

13
@ प्रश्न: इसका एक ऐसा प्रश्न जिसका निश्चित उत्तर नहीं है । एर्गो इसे सीडब्ल्यू बनाते हैं।
dmckee --- पूर्व-मध्यस्थ ने बिल्ली का बच्चा

2
@JD लंबी उल्लसित टिप्पणी। दुर्भाग्य से यह गुना के पीछे छिपा हुआ था। मेरा मतलब है कि कठोर R प्रश्नों का उत्तर देना वास्तव में स्टैक-प्रतिनिधि वार का भुगतान नहीं करता है। तो यह मेरे लिए ठीक है अगर लोग हैं जो अच्छे सवाल सेट करते हैं जो आर मानचित्र पर डालते हैं, अंततः कुछ क्रेडिट प्राप्त करते हैं। इसके अलावा यह निश्चित रूप से अधिक उपयोगी है आर उपयोगकर्ताओं को अपने पसंदीदा सी चाल सवाल की तुलना में सी प्रोग्रामर के लिए होगा ...
मैट बैनर्ट

जवाबों:


64

str() आपको किसी भी वस्तु की संरचना बताता है।


अजगर उपयोग करता है dir()- अधिक समझ में आता है।
हामिश ग्रुबीजन

17
आह, कई भाषाओं में strभी कम है string
हमीश ग्रुबीजन

क्यों नहीं class()? यह इसी प्रकार की सूचना को प्रकट करता है। ऐसी दो आज्ञाएँ क्यों हैं?
hhh

1
class()जानकारी का एक छोटा सा हिस्सा है जो str()प्रदर्शित करता है
हैडली

64

एक बहुत ही उपयोगी फ़ंक्शन जिसका मैं अक्सर उपयोग करता हूं वह है dput (), जो आपको आर कोड के रूप में एक ऑब्जेक्ट को डंप करने की अनुमति देता है।

# Use the iris data set
R> data(iris)
# dput of a numeric vector
R> dput(iris$Petal.Length)
c(1.4, 1.4, 1.3, 1.5, 1.4, 1.7, 1.4, 1.5, 1.4, 1.5, 1.5, 1.6, 
1.4, 1.1, 1.2, 1.5, 1.3, 1.4, 1.7, 1.5, 1.7, 1.5, 1, 1.7, 1.9, 
1.6, 1.6, 1.5, 1.4, 1.6, 1.6, 1.5, 1.5, 1.4, 1.5, 1.2, 1.3, 1.4, 
1.3, 1.5, 1.3, 1.3, 1.3, 1.6, 1.9, 1.4, 1.6, 1.4, 1.5, 1.4, 4.7, 
4.5, 4.9, 4, 4.6, 4.5, 4.7, 3.3, 4.6, 3.9, 3.5, 4.2, 4, 4.7, 
3.6, 4.4, 4.5, 4.1, 4.5, 3.9, 4.8, 4, 4.9, 4.7, 4.3, 4.4, 4.8, 
5, 4.5, 3.5, 3.8, 3.7, 3.9, 5.1, 4.5, 4.5, 4.7, 4.4, 4.1, 4, 
4.4, 4.6, 4, 3.3, 4.2, 4.2, 4.2, 4.3, 3, 4.1, 6, 5.1, 5.9, 5.6, 
5.8, 6.6, 4.5, 6.3, 5.8, 6.1, 5.1, 5.3, 5.5, 5, 5.1, 5.3, 5.5, 
6.7, 6.9, 5, 5.7, 4.9, 6.7, 4.9, 5.7, 6, 4.8, 4.9, 5.6, 5.8, 
6.1, 6.4, 5.6, 5.1, 5.6, 6.1, 5.6, 5.5, 4.8, 5.4, 5.6, 5.1, 5.1, 
5.9, 5.7, 5.2, 5, 5.2, 5.4, 5.1)
# dput of a factor levels
R> dput(levels(iris$Species))
c("setosa", "versicolor", "virginica")

जब आप मदद मांगते हैं, या किसी कारक के स्तरों को संपादित या फिर से व्यवस्थित करने के लिए आसानी से प्रतिलिपि प्रस्तुत करने योग्य डेटा विखंडन पोस्ट करने के लिए यह बहुत उपयोगी हो सकता है।


42

सिर () और पूंछ () डेटाफ़्रेम, वेक्टर, मैट्रिक्स, फ़ंक्शन, आदि के पहले और अंतिम भागों को प्राप्त करने के लिए विशेष रूप से बड़े डेटा फ़्रेम के साथ, यह जाँचने का एक त्वरित तरीका है कि यह ठीक लोड किया गया है।


38

एक अच्छी सुविधा: डेटा पढ़ना उन कनेक्शनों का उपयोग करता है जो स्थानीय फाइलें, http के माध्यम से एक्सेस की गई दूरस्थ फाइलें, अन्य कार्यक्रमों से पाइप या अधिक हो सकते हैं।

एक साधारण उदाहरण के रूप में, एन के लिए इस का उपयोग = से न्यूनतम = 100 और अधिकतम = 200 के बीच 10 यादृच्छिक पूर्णांकों पर विचार random.org (जो बल्कि एक छद्म यादृच्छिक संख्या जनरेटर से वायुमंडलीय शोर के आधार पर सच यादृच्छिक संख्या की आपूर्ति):

R> site <- "http://random.org/integers/"         # base URL
R> query <- "num=10&min=100&max=200&col=2&base=10&format=plain&rnd=new"
R> txt <- paste(site, query, sep="?")            # concat url and query string
R> nums <- read.table(file=txt)                  # and read the data
R> nums                                          # and show it
   V1  V2
1 165 143
2 107 118
3 103 132
4 191 100
5 138 185
R>

एक तरफ के रूप में, यादृच्छिक पैकेज random.org तक पहुँचने के लिए कई सुविधा फ़ंक्शंस प्रदान करता है ।


BTW-- मेरा सुझाव है कि यदि आप (1) आप उन्हें तुरंत पोस्ट करते हैं और (2) आप प्रश्न सीडब्ल्यू नहीं बनाते हैं, तो आपको सेल्फवियर्स सीडब्ल्यू बनाना चाहिए । अन्यथा ऐसा लगता है कि आप रेप सिस्टम को गेम करने की कोशिश कर रहे हैं। YMMV और वह सब।
dmckee --- पूर्व-मध्यस्थ बिल्ली का बच्चा

1
यह सिस्टम गेमिंग नहीं है, बस चीजें शुरू हो रही हैं। वह अभी भी किसी अन्य उत्तर को स्वीकार करने के लिए स्वतंत्र है।
आर्स

2
@ars: वह इस एक को स्वीकार करने के लिए स्वतंत्र है। न ही मैं उसे जीतने के लिए मजबूर करने का प्रयास करने जा रहा हूं यदि वह जीता है, तो मेरी सलाह मत लो। लेकिन मैं विकी को चिह्नित किए बिना एक तैयार किए गए सेल्फी को पोस्ट नहीं करूंगा, और मैं इसके बिना किसी को वोट नहीं दूंगा। जो इसके लायक है उसे ले लो।
dmckee --- पूर्व-मध्यस्थ बिल्ली का बच्चा

4
@ डर्क: यह पूरी तरह से स्वीकार्य है, यहां तक ​​कि जेफ और जोएल द्वारा प्रोत्साहित किया गया है, अपने खुद के सवाल का जवाब देने के लिए। आपके उत्तर को सीडब्ल्यू बनाने के लिए कोई आवश्यकता नहीं है, यहां तक ​​कि एक अनौपचारिक भी नहीं है। आप स्पष्ट रूप से सिस्टम को गेमिंग नहीं कर रहे हैं। एक बार फिर, केवल समुदाय विकी पुलिस की उपेक्षा करें।
जूलियट

8
मुझे इस बात से सहमत होना होगा कि साइटों का उद्देश्य सामान्य समस्याओं और एक सामान्य संसाधन के लिए सर्वोत्तम उत्तर प्रदान करना है। एक प्रश्न प्रस्तुत करना और एक अच्छा उत्तर प्रदान करना किसी विषय को बढ़ाने में मदद कर सकता है। यह आर
kpierce8

35

मुझे लगता है मैं उपयोग कर रहा हूँ with()और within()अधिक से अधिक। $मेरे कोड को और अधिक लेट करने और किसी को खोज पथ पर ऑब्जेक्ट्स को प्रारंभ करने की आवश्यकता नहीं है। अधिक गंभीरता से, मुझे लगता है with()आदि बनाने के इरादे मेरी डेटा विश्लेषण लिपियों के अधिक स्पष्ट।

> df <- data.frame(A = runif(10), B = rnorm(10))
> A <- 1:10 ## something else hanging around...
> with(df, A + B) ## I know this will use A in df!
 [1]  0.04334784 -0.40444686  1.99368816  0.13871605 -1.17734837
 [6]  0.42473812  2.33014226  1.61690799  1.41901860  0.8699079

with()एक वातावरण सेट करता है जिसके भीतर R अभिव्यक्ति का मूल्यांकन किया जाता है। within()एक ही बात करता है, लेकिन आपको पर्यावरण बनाने के लिए उपयोग किए गए डेटा ऑब्जेक्ट को संशोधित करने की अनुमति देता है।

> df <- within(df, C <- rpois(10, lambda = 2))
> head(df)
           A          B C
1 0.62635571 -0.5830079 1
2 0.04810539 -0.4525522 1
3 0.39706979  1.5966184 3
4 0.95802501 -0.8193090 2
5 0.76772541 -1.9450738 2
6 0.21335006  0.2113881 4

जब मुझे पहली बार इस्तेमाल किया गया था तो कुछ भी महसूस नहीं हुआ था within()कि आपको वांछित प्रभाव प्राप्त करने के लिए मूल्यांकन किए गए अभिव्यक्ति के हिस्से के रूप में एक असाइनमेंट करना होगा और लौटी हुई वस्तु (ऊपर के रूप में) को असाइन करना होगा।


34

डेटा इनपुट ट्रिक = RGoogleDocs पैकेज

http://www.omegahat.org/RGoogleDocs/

मैंने पाया है कि Google स्प्रेडशीट सभी सहयोगियों के लिए एक ही पृष्ठ पर होने का एक शानदार तरीका है। इसके अलावा, Google फ़ॉर्म उत्तरदाताओं के डेटा को कैप्चर करने की अनुमति देता है और इसे आसानी से Google स्प्रेडशीट में लिख देता है। चूँकि डेटा बार-बार बदलता है और लगभग कभी भी अंतिम नहीं होता है, इसलिए आर के लिए एक Google स्प्रेडशीट को सीधे पढ़ना पसंद होता है, जो कि csv फ़ाइलों को डाउनलोड करने और उन्हें पढ़ने के साथ फ्यूज़ करने की तुलना में सीधे होता है।

# Get data from google spreadsheet
library(RGoogleDocs)
ps <-readline(prompt="get the password in ")
auth = getGoogleAuth("me@gmail.com", ps, service="wise")
sheets.con <- getGoogleDocsConnection(auth)
ts2=getWorksheets("Data Collection Repos",sheets.con)
names(ts2)
init.consent <-sheetAsMatrix(ts2$Sheet1,header=TRUE, as.data.frame=TRUE, trim=TRUE)

मैं याद नहीं कर सकता, लेकिन निम्नलिखित में से एक या दो कमांड में कई सेकंड लगते हैं।

  1. getGoogleAuth

  2. getGoogleDocsConnection

  3. getWorksheets


27

गैर मानक नामों को संदर्भित करने के लिए बैकटिक्स का उपयोग करें।

> df <- data.frame(x=rnorm(5),y=runif(5))
> names(df) <- 1:2
> df
           1         2
1 -1.2035003 0.6989573
2 -1.2146266 0.8272276
3  0.3563335 0.0947696
4 -0.4372646 0.9765767
5 -0.9952423 0.6477714
> df$1
Error: unexpected numeric constant in "df$1"
> df$`1`
[1] -1.2035003 -1.2146266  0.3563335 -0.4372646 -0.9952423

इस मामले में, df [, "1"] भी काम करेगा। लेकिन बैक टिक्स फॉर्मूलों के अंदर काम करते हैं!

> lm(`2`~`1`,data=df)

Call:
lm(formula = `2` ~ `1`, data = df)

Coefficients:
(Intercept)          `1`  
     0.4087      -0.3440  

[संपादित करें] डिर्क पूछता है कि कोई अमान्य नाम क्यों देगा? मुझे नहीं पता! लेकिन मैं निश्चित रूप से अक्सर इस समस्या का सामना करता हूं। उदाहरण के लिए, हैडले के रिशेप पैकेज का उपयोग करना:

> library(reshape)
> df$z <- c(1,1,2,2,2)
> recast(df,z~.,id.var="z")
Aggregation requires fun.aggregate: length used as default
  z (all)
1 1     4
2 2     6
> recast(df,z~.,id.var="z")$(all)
Error: unexpected '(' in "recast(df,z~.,id.var="z")$("
> recast(df,z~.,id.var="z")$`(all)`
Aggregation requires fun.aggregate: length used as default
[1] 4 6

ठीक है, लेकिन आपको बैकलैक्स की आवश्यकता वाले अमान्य लोगों (जैसे 1 या 2) के साथ वाक्यविन्यास मान्य नामों (जैसे x या y) को बदलने की आवश्यकता क्यों होगी?
डिर्क एडल्डबुलेटेल

3
यह गलत read.tableहोने पर भी उपयोगी check.namesहै - जब आप मूल कॉलम नामों के साथ काम करना चाहते हैं।
हैडली

25

पता नहीं कितनी अच्छी तरह से जाना जाता है / नहीं है, लेकिन कुछ है जो मैंने निश्चित रूप से लाभ उठाया है पर्यावरण के पास-दर-संदर्भ क्षमताओं हैं।

zz <- new.env()
zz$foo <- c(1,2,3,4,5)
changer <- function(blah) {
   blah$foo <- 5
}
changer(zz)
zz$foo

इस उदाहरण के लिए यह समझ में नहीं आता है कि यह उपयोगी क्यों होगा, लेकिन अगर आप बड़ी वस्तुओं को पास कर रहे हैं तो यह मदद कर सकता है।


23

मेरी नई पसंदीदा चीज़ है फ़ोरच लाइब्रेरी। यह आपको सभी अच्छी चीजों को लागू करने देता है, लेकिन कुछ हद तक आसान वाक्य रचना के साथ:

list_powers <- foreach(i = 1:100) %do% {
  lp <- x[i]^i
  return (lp)
}

सबसे अच्छी बात यह है कि यदि आप कुछ ऐसा कर रहे हैं जिसके लिए वास्तव में एक महत्वपूर्ण राशि की आवश्यकता होती है, तो आप एक क्लस्टर में भी तुरंत समानांतर करने के %do%लिए %dopar%(उपयुक्त बैकएंड लाइब्रेरी के साथ) स्विच कर सकते हैं । बहुत चालाक है।


19

मैं डेटा के बुनियादी हेरफेर का एक बहुत है, इसलिए यहाँ हैं दो बिल्ट-इन कार्य ( बदलना , सबसेट ) और एक पुस्तकालय ( sqldf ) है कि मैं दैनिक उपयोग करें।

नमूना बिक्री डेटा बनाएँ

sales <- expand.grid(country = c('USA', 'UK', 'FR'),
                     product = c(1, 2, 3))
sales$revenue <- rnorm(dim(sales)[1], mean=100, sd=10)

> sales
  country product   revenue
1     USA       1 108.45965
2      UK       1  97.07981
3      FR       1  99.66225
4     USA       2 100.34754
5      UK       2  87.12262
6      FR       2 112.86084
7     USA       3  95.87880
8      UK       3  96.43581
9      FR       3  94.59259

एक कॉलम जोड़ने के लिए ट्रांसफ़ॉर्म () का उपयोग करें

## transform currency to euros
usd2eur <- 1.434
transform(sales, euro = revenue * usd2eur)

>
  country product   revenue     euro
1     USA       1 108.45965 155.5311
2      UK       1  97.07981 139.2125
3      FR       1  99.66225 142.9157
...

डेटा को स्लाइस करने के लिए सब्मिट () का उपयोग करें

subset(sales, 
       country == 'USA' & product %in% c(1, 2), 
       select = c('product', 'revenue'))

>
  product  revenue
1       1 108.4597
4       2 100.3475

sqldf () को SQL के साथ स्लाइस और एग्रीगेट करें

Sqldf पैकेज आर डेटा फ्रेम करने के लिए एक एसक्यूएल इंटरफेस प्रदान करता है

##  recast the previous subset() expression in SQL
sqldf('SELECT product, revenue FROM sales \
       WHERE country = "USA" \
       AND product IN (1,2)')

>
  product  revenue
1       1 108.4597
2       2 100.3475

एक एकत्रीकरण या ग्रुप बाय करें

sqldf('select country, sum(revenue) revenue \ 
       FROM sales \
       GROUP BY country')

>
  country  revenue
1      FR 307.1157
2      UK 280.6382
3     USA 304.6860

डेटा फ़्रेम पर अधिक परिष्कृत मैप-कम-जैसी कार्यक्षमता के लिए, प्लाई पैकेज देखें। और अगर अपने आप को अपने बालों को बाहर निकालना चाहते हैं, तो मैं आर के साथ डेटा हेरफेर की जांच करने की सलाह देता हूं ।


18
?ave

'X []' के सब्स्क्राइब्ड औसत हैं, जहां प्रत्येक उपसमूह में समान कारक स्तरों के साथ उन टिप्पणियों का समावेश होता है। एव (x, ..., FUN = माध्य)

मैं इसका हर समय उपयोग करता हूं। ( इस जवाब में यहाँ पर उदाहरण के लिए )


यह टैली (एक्स, फैक्टर, मस्ती) से कैसे भिन्न होता है ??
TMS

1
@ टॉमास एवे ऑर्डरिंग और लंबाई को बरकरार रखता है। इसलिए, उदाहरण के लिए, एक चरण में, एक वेक्टर का समूह अर्थ एक डेटासेट में जोड़ सकते हैं।
एडुआर्डो लियोनी

18

कोड को गति देने और छोरों के लिए खत्म करने का एक तरीका।

मानों की तलाश में डेटाफ्रेम के माध्यम से उस लूप के बजाय लूप। बस उन मूल्यों के साथ डीएफ का एक सबसेट ले लो, बहुत जल्दी।

इसके बजाय:

for(i in 1:nrow(df)){
  if (df$column[i] == x) {
    df$column2[i] <- y
    or any other similiar code
  }
}

कुछ इस तरह से करें:

df$column2[df$column1 == x] <- y

यह आधार अवधारणा बहुत बार लागू होती है और लूप से छुटकारा पाने का एक शानदार तरीका है


11
यहाँ एक छोटा सा जाल है जो मुझे हर समय पकड़ता था। यदि df $ column1 में NA मान सम्‍मिलित हैं, तो == का उपयोग करते हुए सबसेटिंग x और किसी भी NA के बराबर मानों को बाहर निकालेगा । इससे बचने के लिए, "==" के बजाय "% इन%" का उपयोग करें।
मैट पार्कर

मैट आप बिलकुल सही हैं और यह कुछ ऐसा है जिससे मुझे नफरत है, मुझे आपका तरीका पसंद है। मैं आमतौर पर NA के लिए कॉलम की जांच करता हूं और फिर उन्हें एक त्वरित फ़ंक्शन के साथ हटा देता हूं जो कि एक डेटाफ्रेम कॉलम लेता है और सिर्फ उस कॉलम में NA के साथ डेटाफ्रेम माइनस पंक्तियों को वापस करता है।
Dan

अनिवार्य रूप से, मैं स्तंभों के लिए नीचे एक डेटाफ़्रेम देता हूं, जिसमें मुझे मान रखने की आवश्यकता होती है, फिर सही पंक्तियों को प्राप्त करने के लिए na.omit का उपयोग करें और फिर मूल डेटासेट को केवल उन पंक्तियों के साथ उप-भाग दें। बस na.omit का उपयोग करने से किसी भी NA के साथ कोई भी पंक्ति हट जाएगी, हालांकि मुझसे गलती हो सकती है।
Dan

16

कभी-कभी आपको rbindकई डेटा फ़्रेम की आवश्यकता होती है । do.call()क्या आप ऐसा करेंगे (किसी ने मुझे यह समझाने के लिए बाध्य किया था जब मैंने यह प्रश्न पूछा था, क्योंकि यह एक स्पष्ट उपयोग नहीं प्रतीत होता है)।

foo <- list()

foo[[1]] <- data.frame(a=1:5, b=11:15)
foo[[2]] <- data.frame(a=101:105, b=111:115)
foo[[3]] <- data.frame(a=200:210, b=300:310)

do.call(rbind, foo)

अच्छी कॉल: मुझे लगता है कि यह अक्सर उपयोग करने की तुलना में सरल है unsplit
रिची कॉटन

16

आर प्रोग्रामिंग (इंटरेक्टिव सत्र नहीं) में, मैं बहुत उपयोग if (bad.condition) stop("message")करता हूं । प्रत्येक फ़ंक्शन इनमें से कुछ के साथ शुरू होता है, और जैसा कि मैं संगणना के माध्यम से काम करता हूं, मैं इन में काली मिर्च भी डालता हूं। मुझे लगता है कि मैं सी में उपयोग करने से आदत में आया। लाभ दो गुना हैं। सबसे पहले, इन चेकों के साथ काम कोड प्राप्त करना बहुत तेज़ है। दूसरा, और शायद अधिक महत्वपूर्ण, मौजूदा कोड के साथ काम करना बहुत आसान है जब आप अपने संपादक में हर स्क्रीन पर इन जांचों को देखते हैं। आपको आश्चर्य नहीं होगा कि क्या है , या किसी टिप्पणी पर विश्वास करना है कि यह है ... आपको पता चल जाएगा , एक नज़र से, कि यह है।assert()x>0

पुनश्च। मेरी पहली पोस्ट यहाँ नेक बनो!


12
एक बुरी आदत नहीं है, और आर एक और तरीका प्रदान करता है: stopfifnot(!bad.condition)जो अधिक संक्षिप्त है।
डिर्क एडल्डबुलेटेल

13

traceback()समारोह बहुत जरूरी है तो आपको एक त्रुटि कहीं है और यह आसानी से समझ में नहीं आता है। यह स्टैक के ट्रेस को प्रिंट करेगा, बहुत मददगार होगा क्योंकि आर डिफ़ॉल्ट रूप से बहुत क्रिया नहीं है।

फिर सेटिंग options(error=recover)आपको त्रुटि को बढ़ाने वाले फ़ंक्शन में "दर्ज" करने की अनुमति देगा और यह समझने और समझने की कोशिश करेगा कि वास्तव में क्या होता है, जैसे कि आपके पास इस पर पूर्ण नियंत्रण था और इसमें एक डाल सकता browser()था।

ये तीन कार्य वास्तव में आपके कोड को डीबग करने में मदद कर सकते हैं।


1
options(error=recover)मेरी पसंदीदा डिबगिंग विधि है।
जोशुआ उलरिच

12

मैं वास्तव में आश्चर्यचकित हूं कि किसी ने भी आवेदन के बारे में पोस्ट नहीं किया है, टॅाप्ली, लंग्ली और नीलम। आर में सामान करते समय एक सामान्य नियम जो मैं उपयोग करता हूं वह यह है कि अगर मेरे पास एक लूप है जो डेटा प्रोसेसिंग या सिमुलेशन कर रहा है, तो मैं इसे लागू करने की कोशिश करता हूं और इसे * लागू करने के साथ प्रतिस्थापित करता हूं। कुछ लोग * कार्यों को लागू करने से कतराते हैं क्योंकि उन्हें लगता है कि केवल एकल पैरामीटर फ़ंक्शन ही पारित किए जा सकते हैं। सच्चाई से आगे कुछ भी नहीं हो सकता है! जावास्क्रिप्ट में प्रथम श्रेणी की वस्तुओं के रूप में मापदंडों के साथ कार्यों के आसपास से गुजरने की तरह, आप इसे अनाम कार्यों के साथ आर में करते हैं। उदाहरण के लिए:

 > sapply(rnorm(100, 0, 1), round)
  [1]  1  1  0  1  1 -1 -2  0  2  2 -2 -1  0  1 -1  0  1 -1  0 -1  0  0  0  0  0
 [26]  2  0 -1 -2  0  0  1 -1  1  5  1 -1  0  1  1  1  2  0 -1  1 -1  1  0 -1  1
 [51]  2  1  1 -2 -1  0 -1  2 -1  1 -1  1 -1  0 -1 -2  1  1  0 -1 -1  1  1  2  0
 [76]  0  0  0 -2 -1  1  1 -2  1 -1  1  1  1  0  0  0 -1 -3  0 -1  0  0  0  1  1


> sapply(rnorm(100, 0, 1), round(x, 2)) # How can we pass a parameter?
Error in match.fun(FUN) : object 'x' not found


# Wrap your function call in an anonymous function to use parameters
> sapply(rnorm(100, 0, 1), function(x) {round(x, 2)})
  [1] -0.05 -1.74 -0.09 -1.23  0.69 -1.43  0.76  0.55  0.96 -0.47 -0.81 -0.47
 [13]  0.27  0.32  0.47 -1.28 -1.44 -1.93  0.51 -0.82 -0.06 -1.41  1.23 -0.26
 [25]  0.22 -0.04 -2.17  0.60 -0.10 -0.92  0.13  2.62  1.03 -1.33 -1.73 -0.08
 [37]  0.45 -0.93  0.40  0.05  1.09 -1.23 -0.35  0.62  0.01 -1.08  1.70 -1.27
 [49]  0.55  0.60 -1.46  1.08 -1.88 -0.15  0.21  0.06  0.53 -1.16 -2.13 -0.03
 [61]  0.33 -1.07  0.98  0.62 -0.01 -0.53 -1.17 -0.28 -0.95  0.71 -0.58 -0.03
 [73] -1.47 -0.75 -0.54  0.42 -1.63  0.05 -1.90  0.40 -0.01  0.14 -1.58  1.37
 [85] -1.00 -0.90  1.69 -0.11 -2.19 -0.74  1.34 -0.75 -0.51 -0.99 -0.36 -1.63
 [97] -0.98  0.61  1.01  0.55

# Note that anonymous functions aren't being called, but being passed.
> function() {print('hello #rstats')}()
function() {print('hello #rstats')}()
> a = function() {print('hello #rstats')}
> a
function() {print('hello #rstats')}
> a()
[1] "hello #rstats"

(#Rstats को फॉलो करने वालों के लिए, मैंने भी यह पोस्ट किया है)।

याद रखें, लागू करें, नीलमणि, लंगोटी, टप्पली, और do.call का उपयोग करें! आर के वैश्वीकरण का लाभ उठाएं। आपको कभी भी R कोड के एक समूह तक नहीं जाना चाहिए और देखना चाहिए:

N = 10000
l = numeric()
for (i in seq(1:N)) {
    sim <- rnorm(1, 0, 1)
    l <- rbind(l, sim)
}

यह न केवल सदिश है, बल्कि R में सरणी संरचना नहीं है क्योंकि यह पाइथन में है (दोगुना आकार जब अंतरिक्ष चलता है, IIRC)। इसलिए प्रत्येक rbind चरण को rbind () से परिणाम स्वीकार करने के लिए पहले l को पर्याप्त रूप से विकसित करना चाहिए, फिर सभी पिछले l की सामग्री पर कॉपी करें। मज़े के लिए, उपरोक्त आर में प्रयास करें। ध्यान दें कि आपको कितना समय लगता है (आपको रिफ़ॉर्म या किसी भी टाइमिंग फ़ंक्शन की आवश्यकता नहीं होगी)। फिर कोशिश करो

N=10000
l <- rnorm(N, 0, 1)

निम्नलिखित पहले संस्करण से भी बेहतर है:

N = 10000
l = numeric(N)
for (i in seq(1:N)) {
    sim <- rnorm(1, 0, 1)
    l[i] <- sim
}

लागू करें, नीलम, लंगोटी और टप्पली उपयोगी हैं। यदि आप किसी नामित फ़ंक्शन को राउंड जैसे मापदंडों को पास करना चाहते हैं, तो आप इसे गुमनाम फ़ंक्शन लिखने के बजाय आवेदन के साथ पास कर सकते हैं। "Sapply (rnorm (10, 0, 1), गोल, अंक = 2)" का प्रयास करें जो "आउटपुट" [1] -0.29 0.29 1.31 -0.06 -1.90 -0.84 0.21 0.02 0.23 -1.10 "।
डेनियल

11

डिर्क की सलाह पर, मैं एकल उदाहरण पोस्ट कर रहा हूं। मुझे आशा है कि वे बहुत "प्यारे" नहीं हैं [चतुर, लेकिन मुझे परवाह नहीं है] या इस दर्शकों के लिए तुच्छ।

रैखिक मॉडल आर की रोटी और मक्खन हैं। जब स्वतंत्र चर की संख्या अधिक होती है, तो एक के पास दो विकल्प होते हैं। पहला यह है कि lm.fit () का उपयोग करें, जो डिज़ाइन मैट्रिक्स x और प्रतिक्रिया y को तर्क के रूप में प्राप्त करता है, उसी तरह मतलाब को भी। इस दृष्टिकोण की कमी यह है कि रिटर्न वैल्यू वस्तुओं की एक सूची है (फिट किए गए गुणांक, अवशिष्ट, आदि), न कि कक्षा "एलएम" की एक वस्तु, जो अच्छी तरह से संक्षेप में बताई जा सकती है, जिसका उपयोग भविष्यवाणी, स्टेपल चयन, आदि के लिए किया जाता है। दूसरा। दृष्टिकोण एक सूत्र बना रहा है:

> A
           X1         X2          X3         X4         y
1  0.96852363 0.33827107 0.261332257 0.62817021 1.6425326
2  0.08012755 0.69159828 0.087994158 0.93780481 0.9801304
3  0.10167545 0.38119304 0.865209832 0.16501662 0.4830873
4  0.06699458 0.41756415 0.258071616 0.34027775 0.7508766
   ...

> (f=paste("y ~",paste(names(A)[1:4],collapse=" + ")))
[1] "y ~ X1 + X2 + X3 + X4"

> lm(formula(f),data=A)

Call:
lm(formula = formula(f), data = A)

Coefficients:
(Intercept)           X1           X2           X3           X4  
    0.78236      0.95406     -0.06738     -0.43686     -0.06644  

कैसे के बारे में अगर आप एक प्रति पोस्ट और उदाहरण के साथ वर्णन? इसके बाद हम अंत तक दिनों को जारी रख सकते हैं और नए आदेशों के साथ नए उदाहरण पोस्ट कर सकते हैं ... [BTW: जैसा कि मुझे याद है, आपको फॉर्मूला उपयोग के लिए as.formula (पेस्ट (...)) की आवश्यकता है। ]
डिर्क एडल्डबुलेटेल

सभी स्तंभों को "y ~। - 1" के रूप में कवर करने के लिए आपको स्पष्ट रूप से सूत्र निर्माण की आवश्यकता नहीं है। ""। का अर्थ है 'निर्भर चर को छोड़कर सभी कॉलम, और' - 1 'आपके उदाहरण के अनुसार स्थिरांक को बाहर करता है।
डिर्क एडल्डबुलेटेल

यह इस विशिष्ट उदाहरण के लिए सही है, लेकिन एक्स के लिए ncols >> nrows के साथ, मैं अक्सर कुछ स्वतंत्र चर हटाता हूं, खासकर विश्लेषण के अंतिम चरणों में। इस मामले में, डेटा फ़्रेम नामों से एक सूत्र बनाना अभी भी आसान है।
गप्पे

10

यदि आप किसी अन्य ब्लॉक से लौट रहे मान को असाइन कर सकते हैं।

इसके बजाय, उदाहरण के लिए

condition <- runif(1) > 0.5
if(condition) x <- 1 else x <- 2

तुम कर सकते हो

x <- if(condition) 1 else 2

वास्तव में यह कैसे काम करता है गहरा जादू है।


6
आप इसे x <- ifelse (स्थिति, 1, 2) की तरह भी कर सकते हैं, जिस स्थिति में प्रत्येक घटक सदिश है।
शेन

शेन, आप कर सकते हैं, लेकिन जब तक आप वास्तव में गहराई से ग्रिप नहीं करते हैं, तब तक आप शायद ऐसा न करें! यह एक आसान गलतफहमी है ...
हरलन

उसके बारे में क्या जादुई है? यह if-then-elseकिसी भी कार्यात्मक भाषा में अभिव्यक्ति का काम करने का तरीका है ( if-then-else बयानों के साथ भ्रमित नहीं होना )। ?:सी-जैसी भाषाओं के टर्नरी ऑपरेटर के समान ।
फ्रैंक

10

आर के कुल noob के रूप में और आँकड़े पर एक नौसिखिया मैं unclass() एक साधारण सूची के रूप में एक डेटा फ्रेम के सभी तत्वों को मुद्रित करने के लिए प्यार करता हूँ ।

यह एक पूर्ण डेटा पर एक नज़र के लिए बहुत आसान है, जो किसी भी संभावित मुद्दों को जल्दी से देखने के लिए सभी में जाता है।


9

CrossTable()gmodelsपैकेज से एसएएस- और एसपीएस-शैली के क्रॉसस्टैब्स को सामान्य परीक्षणों (चिसक, मैकनेमार, आदि) के साथ आसान पहुंच प्रदान करता है। असल में, यह xtabs()फैंसी आउटपुट और कुछ अतिरिक्त परीक्षणों के साथ है - लेकिन यह हीथेन के साथ साझाकरण को आसान बनाता है।


अच्छा !! मैं gmodels का उपयोग बहुत कम करता हूं, लेकिन वह चूक गया
अभिजीत

अच्छा जवाब, कुछ भी जो मुझे हीथ्स के साथ तालिकाओं की अत्यधिक व्याख्या से दूर रख सकता है, समय का एक अच्छा उपयोग है।
स्टडी

7

निश्चित रूप से system()। आर पर्यावरण के अंदर से सभी यूनिक्स उपकरणों (कम से कम लिनक्स / मैकओएसएक्स के तहत) तक पहुंच बनाने में सक्षम होने के लिए तेजी से मेरे दैनिक वर्कफ़्लो में अमूल्य हो गया है।


1
कनेक्शन के बारे में मेरी पहले की टिप्पणी में इसका संबंध है: आप यूनिक्स कमांड से डेटा पास करने के लिए पाइप () का भी उपयोग कर सकते हैं। help(connections)विवरण और उदाहरण के लिए देखें ।
डिर्क एडल्डबुलेटेल

6

एक कारक को संख्यात्मक में बदलने के लिए यहां एक कष्टप्रद समाधान है। (अन्य डेटा प्रकारों के लिए भी समान)

old.var <- as.numeric(levels(old.var))[as.numeric(old.var)]

2
शायद आपका मतलब "एक चरक में" वेक्टर था। जिस स्थिति में "as.character (old.var)" सरल है।
डिर्क एडल्डबुलेटेल

1
मैंने हमेशा इस सलाह (जो कि कारक पर पढ़ी जा सकती है) को गुमराह करने के लिए सोचा है। आपको यह सुनिश्चित करना होगा कि पुराना .var एक कारक है, और यह R सत्र के लिए आपके द्वारा निर्धारित विकल्पों के अनुसार अलग-अलग होगा। As.numeric (as.character (old.var)) का उपयोग करना सुरक्षित और क्लीनर दोनों है।
एडुआर्डो लियोनी

वास्तव में एक मूल्य के लायक नहीं है, लेकिन जो भी हो। यह मेरे लिए काम करता है।
रयान आर। रोसारियो

रयान - क्या आप अपना कोड ठीक कर सकते हैं? यदि पुराना.वर <- कारक (1: 2); आपका कोड [1] "1" "2" (संख्यात्मक नहीं) दे देगा।
एडुआर्डो लियोनी

3
या थोड़ा और अधिक कुशलता से:as.numeric(levels(old.var))[old.var]
हैडली

6

हालाँकि यह सवाल कुछ समय के लिए रहा है लेकिन मैंने हाल ही में SAS और R ब्लॉग पर कमांड का उपयोग करने के लिए एक बेहतरीन ट्रिक खोजी है cut। आदेश का उपयोग डेटा को श्रेणियों में विभाजित करने के लिए किया जाता है और मैं आईरिस डेटासेट को एक उदाहरण के रूप में उपयोग करूंगा और इसे 10 श्रेणियों में विभाजित करूंगा:

> irisSL <- iris$Sepal.Length
> str(irisSL)
 num [1:150] 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
> cut(irisSL, 10)
  [1] (5.02,5.38] (4.66,5.02] (4.66,5.02] (4.3,4.66]  (4.66,5.02] (5.38,5.74] (4.3,4.66]  (4.66,5.02] (4.3,4.66]  (4.66,5.02]
 [11] (5.38,5.74] (4.66,5.02] (4.66,5.02] (4.3,4.66]  (5.74,6.1]  (5.38,5.74] (5.38,5.74] (5.02,5.38] (5.38,5.74] (5.02,5.38]
 [21] (5.38,5.74] (5.02,5.38] (4.3,4.66]  (5.02,5.38] (4.66,5.02] (4.66,5.02] (4.66,5.02] (5.02,5.38] (5.02,5.38] (4.66,5.02]
 [31] (4.66,5.02] (5.38,5.74] (5.02,5.38] (5.38,5.74] (4.66,5.02] (4.66,5.02] (5.38,5.74] (4.66,5.02] (4.3,4.66]  (5.02,5.38]
 [41] (4.66,5.02] (4.3,4.66]  (4.3,4.66]  (4.66,5.02] (5.02,5.38] (4.66,5.02] (5.02,5.38] (4.3,4.66]  (5.02,5.38] (4.66,5.02]
 [51] (6.82,7.18] (6.1,6.46]  (6.82,7.18] (5.38,5.74] (6.46,6.82] (5.38,5.74] (6.1,6.46]  (4.66,5.02] (6.46,6.82] (5.02,5.38]
 [61] (4.66,5.02] (5.74,6.1]  (5.74,6.1]  (5.74,6.1]  (5.38,5.74] (6.46,6.82] (5.38,5.74] (5.74,6.1]  (6.1,6.46]  (5.38,5.74]
 [71] (5.74,6.1]  (5.74,6.1]  (6.1,6.46]  (5.74,6.1]  (6.1,6.46]  (6.46,6.82] (6.46,6.82] (6.46,6.82] (5.74,6.1]  (5.38,5.74]
 [81] (5.38,5.74] (5.38,5.74] (5.74,6.1]  (5.74,6.1]  (5.38,5.74] (5.74,6.1]  (6.46,6.82] (6.1,6.46]  (5.38,5.74] (5.38,5.74]
 [91] (5.38,5.74] (5.74,6.1]  (5.74,6.1]  (4.66,5.02] (5.38,5.74] (5.38,5.74] (5.38,5.74] (6.1,6.46]  (5.02,5.38] (5.38,5.74]
[101] (6.1,6.46]  (5.74,6.1]  (6.82,7.18] (6.1,6.46]  (6.46,6.82] (7.54,7.9]  (4.66,5.02] (7.18,7.54] (6.46,6.82] (7.18,7.54]
[111] (6.46,6.82] (6.1,6.46]  (6.46,6.82] (5.38,5.74] (5.74,6.1]  (6.1,6.46]  (6.46,6.82] (7.54,7.9]  (7.54,7.9]  (5.74,6.1] 
[121] (6.82,7.18] (5.38,5.74] (7.54,7.9]  (6.1,6.46]  (6.46,6.82] (7.18,7.54] (6.1,6.46]  (5.74,6.1]  (6.1,6.46]  (7.18,7.54]
[131] (7.18,7.54] (7.54,7.9]  (6.1,6.46]  (6.1,6.46]  (5.74,6.1]  (7.54,7.9]  (6.1,6.46]  (6.1,6.46]  (5.74,6.1]  (6.82,7.18]
[141] (6.46,6.82] (6.82,7.18] (5.74,6.1]  (6.46,6.82] (6.46,6.82] (6.46,6.82] (6.1,6.46]  (6.46,6.82] (6.1,6.46]  (5.74,6.1] 
10 Levels: (4.3,4.66] (4.66,5.02] (5.02,5.38] (5.38,5.74] (5.74,6.1] (6.1,6.46] (6.46,6.82] (6.82,7.18] ... (7.54,7.9]

5

एक और तरकीब। कुछ पैकेज, जैसे glmnet, केवल इनपुट मैट्रिक्स के रूप में लेते हैं और प्रतिक्रिया चर। यदि कोई मॉडल के बीच सभी इंटरैक्शन के साथ एक मॉडल फिट करना चाहता है, तो वह सूत्र "y ~। ^ 2" का उपयोग नहीं कर सकता है। उपयोग expand.grid()करने से हम आर के शक्तिशाली सरणी इंडेक्सिंग और वेक्टर संचालन का लाभ उठा सकते हैं।

interArray=function(X){
    n=ncol(X)
    ind=expand.grid(1:n,1:n)
    return(X[,ind[,1]]*X[,ind[,2]])
}

> X
          X1         X2
1 0.96852363 0.33827107
2 0.08012755 0.69159828
3 0.10167545 0.38119304
4 0.06699458 0.41756415
5 0.08187816 0.09805104

> interArray(X)
           X1          X2        X1.1        X2.1
1 0.938038022 0.327623524 0.327623524 0.114427316
2 0.006420424 0.055416073 0.055416073 0.478308177
3 0.010337897 0.038757974 0.038757974 0.145308137
4 0.004488274 0.027974536 0.027974536 0.174359821
5 0.006704033 0.008028239 0.008028239 0.009614007

3
यदि कोई मॉडलिंग फ़ंक्शन एक सूत्र को स्वीकार नहीं करता है (जो बहुत दुर्लभ है!) तो डिज़ाइन मैट्रिक्स के साथ निर्माण करना बेहतर नहीं होगा model.matrix?
हैडली

अच्छा है। मुझे इस समारोह के अस्तित्व का पता नहीं था। ऊपर फ़ंक्शन मॉडल.मेट्रिक्स (~। ^ 2 -1, X) के बराबर है, लेकिन मैमटिक्स पास करने के बारे में, ग्लमैनेट से अलग, मेरे लिए अक्सर कस्टम सी फ़ंक्शन को सरणी पॉइंटर्स पास करना है। वास्तव में, मुझे नहीं पता होगा कि किसी फ़ंक्शन को एक सूत्र कैसे पास किया जाए। क्या आपके पास एक खिलौना उदाहरण है?
gappy

5

मेरे पसंदीदा में से एक, अगर कुछ अपरंपरागत चाल नहीं है, का उपयोग eval()और है parse()। यह उदाहरण शायद यह दर्शाता है कि यह कैसे सहायक हो सकता है

NY.Capital <- 'Albany'
state <- 'NY'
parameter <- 'Capital'
eval(parse(text=paste(state, parameter, sep='.')))

[1] "Albany"

इस प्रकार की स्थिति अधिक बार नहीं होती है, और इसका उपयोग करने eval()और parse()इसे संबोधित करने में मदद कर सकती है। बेशक, मैं इसे कोड करने के वैकल्पिक तरीकों पर किसी भी प्रतिक्रिया का स्वागत करता हूं।


1
यह नामांकित वेक्टर तत्वों के साथ भी किया जा सकता है।
डिर्क एडल्डबुलेटेल

3
पुस्तकालय (भाग्य), भाग्य (106) यदि उत्तर पार्स है () तो आपको आमतौर पर प्रश्न पर पुनर्विचार करना चाहिए। - थॉमस लुमले आर-हेल्प (फरवरी 2005)
एडुआर्डो लियोनी

यहाँ एक उदाहरण है जहाँ eval () और parse () उपयोगी हो सकता है। इसमें एक बायोकॉन्टर पैकेज शामिल है, उदाहरण के लिए hgu133a.db और जहाँ आप प्रोबेश आईडी के बारे में विभिन्न जानकारी प्राप्त करने की कोशिश कर रहे हैं। उदाहरण के लिए: पुस्तकालय (hgu133a.db) पैरामीटर <- 'SYMBOL' mget ('202431_s_at', env = eval (पार्स (पाठ = पेस्ट ('hgu133a'), पैरामीटर, sep = ''))) पैरामीटर <- 'ENTREZID 'mget (' 202431_s_at ', env = eval (पार्स (पाठ = पेस्ट (' hgu133a ', पैरामीटर, sep =' ')))
andrewj

जैसा कि डिर्क कहते हैं, यह बेहतर वेक्टर तत्वों के साथ किया जाता है, या `प्राप्त (पेस्ट (राज्य, पैरामीटर, sep = '।'))`
हैडली

@ हडले, नहीं जानता था कि आप इस तरह से () का उपयोग कर सकते हैं। धन्यवाद।
andrewj

5

set.seed() यादृच्छिक संख्या जनरेटर राज्य सेट करता है।

उदाहरण के लिए:

> set.seed(123)
> rnorm(1)
[1] -0.5604756
> rnorm(1)
[1] -0.2301775
> set.seed(123)
> rnorm(1)
[1] -0.5604756

यादृच्छिक कार्यों का उपयोग करने वाले उदाहरणों के साथ सुपर उपयोगी ... सभी को एक ही पृष्ठ पर लाने में मदद करता है
JD लॉन्ग

5

जो लोग R से बुलाए जाने के लिए C लिख रहे हैं उनके लिए .Internal(inspect(...))यह आसान है। उदाहरण के लिए:

> .Internal(inspect(quote(a+2)))
  @867dc28 06 LANGSXP g0c0 [] 
  @8436998 01 SYMSXP g1c0 [MARK,gp=0x4000] "+"
  @85768b0 01 SYMSXP g1c0 [MARK,NAM(2)] "a"
  @8d7bf48 14 REALSXP g0c1 [] (len=1, tl=0) 2

4

d = '~ / R कोड / पुस्तकालय /'

फाइलें = सूची.फाइल्स (डी, 'आर $')

for (फ़ाइलों में f) {if (((f == 'mysource.r')) {प्रिंट (पेस्ट ('सोर्सिंग', f)) स्रोत (पेस्ट (d, f, sep = ''))}}

मैं उपरोक्त कोड का उपयोग एक निर्देशिका में सभी फाइलों को स्रोत पर करता हूं जो कि आर के साथ मेरे इंटरैक्टिव सत्र में उपयोग किए जाने वाले विभिन्न उपयोगिता कार्यक्रमों के साथ है। मुझे यकीन है कि बेहतर तरीके हैं, लेकिन मुझे यह मेरे काम के लिए उपयोगी लगता है। ऐसा करने वाली रेखा इस प्रकार है।

स्रोत ("~ / आर कोड / लाइब्रेरी / mysource.r")


6
यह मत करो। एक पैकेज लिखें।
डिर्क एडडेलबेटेल

धन्यवाद। मैं roxygen पर एक या दो थ्रेड देख रहा हूं और ऐसा लगता है कि मैं शायद उस स्तर पर हूं जहां मुझे एक साधारण सेल्फ यूज पैकेज लिखने की कोशिश करनी चाहिए।
मचेमा

3

एक डेटा फ़्रेम में कई चर पर एक ऑपरेशन करने के लिए। यह subset.data.frame से चोरी हो गया है।

get.vars<-function(vars,data){
    nl <- as.list(1L:ncol(data))
    names(nl) <- names(data)
    vars <- eval(substitute(vars), nl, parent.frame())
    data[,vars]
    #do stuff here
}

get.vars(c(cyl:hwy,class),mpg)

1
यह पहली बार में अच्छा लग रहा है, लेकिन इस तरह के कोड से आपको लंबे समय तक कोई परेशानी नहीं होगी। हमेशा स्पष्ट होना बेहतर है।
हैडले

hum, मैं इस ट्रिक का प्रयोग काफी देर से कर रहा हूँ। क्या आप इसके बिना परेशानी के बारे में अधिक विशिष्ट हो सकते हैं?
इयान फैलो

हो सकता है कि हैडली इसके बजाय प्लाई पैकेज का उपयोग करने का सुझाव दे रही हो?
क्रिस्टोफर डुबोइस

3
नहीं, इसके बजाय प्लाई का उपयोग करने के लिए एक छोटा सुझाव नहीं है। आपके कोड के साथ मूल रूप से समस्या यह है कि यह शब्दशः आलसी है - उपयोगकर्ता को स्पष्ट रूप से बताने के बजाय कि वे क्या चाहते हैं, आप अनुमान लगाने के लिए कुछ "जादू" करते हैं। इसके साथ समस्या यह है कि यह फ़ंक्शन को प्रोग्राम के साथ बहुत कठिन बनाता है - अर्थात यह एक फ़ंक्शन लिखना मुश्किल है जो कि get.varsपूरे ढेर सारे हूप्स के बिना कूदता है।
हैडली

3

मैंने इसे एक बार पहले पोस्ट किया है, लेकिन मैं इसे बहुत उपयोग करता हूं मैंने सोचा कि मैं इसे फिर से पोस्ट करूंगा। एक data.frame के नाम और स्थिति संख्या को वापस करने के लिए इसका सिर्फ एक छोटा सा कार्य है। यह सुनिश्चित करने के लिए विशेष कुछ भी नहीं है, लेकिन मैं लगभग इसे कई बार उपयोग किए बिना सत्र के माध्यम से कभी नहीं बनाता हूं।

##creates an object from a data.frame listing the column names and location

namesind = समारोह (DF) {

temp1=names(df)
temp2=seq(1,length(temp1))
temp3=data.frame(temp1,temp2)
names(temp3)=c("VAR","COL")
return(temp3)
rm(temp1,temp2,temp3)

}

ni <- nameind


4
यह वास्तव में वन-लाइनर है:data.frame(VAR = names(df), COL = seq_along(df))
हैडली

बहुत ही सुंदर, शायद मैं इसे ni <- function (df) {data.frame (VAR = names (df)), COL = seq_along (df))}
kpierce8

1
मैं उपयोग करता हूं: data.frame (कॉलनाम (the.df))
ताल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.