2013-08-13 13 views
10

पर लागू होने पर लागू चरित्र रूपांतरण से कैसे बचें डेटाफ्रेम पर apply का उपयोग करते समय, तर्क (अंतर्निहित रूप से) चरित्र में परिवर्तित होते हैं। एक उदाहरण:डेटाफ्रेम

df <- data.frame(v=1:10, t=1:10) 
df <- transform(df, t2 = as.POSIXlt(t, origin = "2013-08-13")) 
class(df$t2[1]) 
## [1] "POSIXct" "POSIXt" (correct) 

लेकिन:

apply(df, 1, function(y) class(y["t2"])) 
## [1] "character" "character" "character" "character" "character" "character" 
## [7] "character" "character" "character" "character" 

वहाँ किसी भी तरह से इस रूपांतरण से बचने के लिए है? या क्या मुझे हमेशा as.POSIXlt(y["t2"]) के माध्यम से वापस परिवर्तित करना है?

संपादित
मेरे df 2 timestamps (जैसे कि, t2 और T3) और कुछ अन्य क्षेत्रों है (जैसे कि, v1, v2)। दिए गए टी 2 के साथ प्रत्येक पंक्ति के लिए, मैं टी (निकट 3) पंक्तियों को निकटतम टी 3 के साथ खोजना चाहता हूं, लेकिन टी 2 (और वही v1) से कम, और इन पंक्तियों (उदाहरण के लिए औसत) से v2 पर आंकड़े वापस कराना चाहता हूं। मैंने एक फ़ंक्शन एफ (टी 2, वी 1, डीएफ) लिखा और बस apply(df, 1, function(x) f(y["t2"], y["v1"], df) का उपयोग करके सभी पंक्तियों पर इसे लागू करना चाहता था। आर में ऐसी चीजों को करने का कोई बेहतर तरीका है?

+5

वास्तविक जवाब यह है कि आपको डेटा फ्रेम पर 'लागू' का उपयोग नहीं करना चाहिए। तुम क्या करने की कोशिश कर रहे हो? – joran

+7

* रूपांतरण * हो रहा है क्योंकि आपका 'data.frame' को' matrix' पर ले जाया जा रहा है। –

+0

आपके संपादन के अनुसार आपके पास वास्तव में दो अलग-अलग प्रश्न हैं (आईएमओ)। मैं कहूंगा कि एक उचित डेटा सेट, आपने जो कोशिश की है और वांछित आउटपुट के साथ दूसरे प्रश्न (आपका संपादन) पूछें। –

उत्तर

4

चलो एक स्पष्टीकरण में कई टिप्पणियां लपेट।

  1. apply का उपयोग एक matrix करने के लिए एक data.frame बदल देता है। यह का अर्थ है कि कम से कम प्रतिबंधित वर्ग का उपयोग किया जाएगा। इस मामले में कम से कम प्रतिबंधित है चरित्र है।
  2. आप 1 से applyMARGIN तर्क की आपूर्ति कर रहे हैं। यह पंक्ति से लागू होता है और आपको इससे भी बदतर बना देता है क्योंकि आप वाकई कक्षाओं को मिश्रित कर रहे हैं। इस परिदृश्य में आप apply का उपयोग कर रहे हैं मैट्रिक्स और वेक्टर पर डेटा.फ्रेम के लिए डिज़ाइन किया गया है। यह नौकरी के लिए सही उपकरण नहीं है।
  3. चौथाई मामले के रूप में आरएमके बताते एकल t2 स्तंभ की कक्षाओं हड़पने के लिए मैं lapply या sapply का उपयोग करेंगे में नीचे के रूप में देखी गई:

कोड:

df <- data.frame(v=1:10, t=1:10) 
df <- transform(df, t2 = as.POSIXlt(t, origin = "2013-08-13")) 

sapply(df[, "t2"], class) 
lapply(df[, "t2"], class) 

## [[1]] 
## [1] "POSIXct" "POSIXt" 
## 
## [[2]] 
## [1] "POSIXct" "POSIXt" 
## 
## [[3]] 
## [1] "POSIXct" "POSIXt" 
## 
## . 
## . 
## . 
## 
## [[9]] 
## [1] "POSIXct" "POSIXt" 
## 
## [[10]] 
## [1] "POSIXct" "POSIXt" 

सामान्य तौर पर आपके द्वारा चुने गए apply परिवार जो नौकरी फिट बैठता है। अक्सर मैं व्यक्तिगत कॉलम पर कार्य करने के लिए lapply या for पाश का उपयोग करता हूं या इंडेक्सिंग ([, ]) का उपयोग करने वाले कॉलम को सबसेट करता हूं और फिर apply के साथ आगे बढ़ता हूं। इस समस्या का उत्तर वास्तव में यह निर्धारित करने के लिए उबलता है कि आप क्या हासिल करना चाहते हैं, पूछना apply सबसे उचित उपकरण है, और वहां से आगे बढ़ें।

मई मैं इस blog post को विभिन्न apply कार्यों के परिवार के बारे में एक उत्कृष्ट ट्यूटोरियल के रूप में पेश कर सकता हूं।

+1

ब्लॉग पोस्ट उत्कृष्ट है, लेकिन मुझे लगता है कि यह मेरी समस्या का समाधान नहीं करता है। डेटा फ्रेम के लिए 'by' का उपयोग किया जाना चाहिए, लेकिन मुझे v1 द्वारा समूहबद्ध करने की आवश्यकता है। –

0

प्रयास करें:

sapply(df, function(y) class(y["t2"])) 

$v 
[1] "integer" 

$t 
[1] "integer" 

$t2 
[1] "POSIXct" "POSIXt" 
+1

धन्यवाद, लेकिन मुझे डेटा फ्रेम की प्रत्येक पंक्ति में अपना फ़ंक्शन लागू करने की आवश्यकता है। नतीजतन, मैं मूल डेटा फ्रेम के रूप में कई पंक्तियों को चाहता हूँ। –