2012-10-10 17 views
6

ave समारोह के माध्यम से देख रहे हैं, मैं एक उल्लेखनीय लाइन पाया। मुझे उम्मीद थी कि split(x,g) परिणामस्वरूप एक सूची होगी, जिसे असाइन किया जा सकता है, लेकिन बाद में त्याग दिया जा सकता है। मेरा सवाल है, x का मूल्य क्यों बदलता है?असाइनमेंट में परिवर्तन चर

एक और उदाहरण बेहतर समझा जा सकता है:

a <- data.frame(id=c(1,1,2,2), value=c(4,5,7,6)) 
# id value 
# 1 1  4 
# 2 1  5 
# 3 2  7 
# 4 2  6 

split(a,a$id) # Split a row-wise by id into a list of size 2 
# $`1` 
# id value 
# 1 1  4 
# 2 1  5 
# $`2` 
# id value 
# 3 2  7 
# 4 2  6 

# Find the row with highest value for each id 
lapply(split(a,a$id),function(x) x[which.max(x$value),]) 
# $`1` 
# id value 
# 2 1  5 
# $`2` 
# id value 
# 3 2  7 

# Assigning to the split changes the data.frame a! 
split(a,a$id)<-lapply(split(a,a$id),function(x) x[which.max(x$value),]) 
a 
# id value 
# 1 1  5 
# 2 1  5 
# 3 2  7 
# 4 2  7 

इतना ही नहीं a बदल गया है, लेकिन यह है कि काम के दाहिने हाथ की ओर की तरह नहीं दिखता एक मूल्य के लिए बदल! यहां तक ​​कि split(a,a$id) को असाइन करने पर भी a (जो मुझे समझ में नहीं आता है) बदलता है, तो list के बजाय data.frame क्यों होता है?

ध्यान दें कि मैं समझता हूं कि इस कार्य को पूरा करने के बेहतर तरीके हैं। मेरा सवाल है कि split(a,a$id)<-lapply(split(a,a$id),function(x) x[which.max(x$value),])a क्यों बदलता है?

+2

जो फ़ंक्शन आप कॉल कर रहे हैं वह 'विभाजित <-' है,' split' नहीं। वे दो अलग-अलग कार्य हैं। 'विभाजित <- डिफ़ॉल्ट' देखें और यह स्पष्ट है कि 'ए 'क्यों बदलता है। –

+0

और आपको फ़ंक्शन प्रिंट करने के लिए बैकक्वॉट्स का उपयोग करना होगा क्योंकि फ़ंक्शन नाम में ऑपरेटर होता है: '\' विभाजन <- डिफ़ॉल्ट \ ''। –

+0

मैं यह मामला, प्रासंगिक कार्य \ \ 'विभाजित नहीं होगा <-। Data.frame \' '? – nograpes

उत्तर

2

विभाजन के लिए मदद पृष्ठ अपने शीर्षक में कहते हैं देख सकते हैं: "प्रतिस्थापन रूपों इस तरह के एक विभाजन करने के लिए इसी मूल्यों की जगह। " तो यह वास्तव में अप्रत्याशित नहीं होना चाहिए, हालांकि मैं मानता हूं कि इसका व्यापक रूप से उपयोग नहीं किया जाता है। मुझे समझ में नहीं आता कि आपका उदाहरण कैसे दिखाता है कि असाइन किए गए मान "असाइनमेंट के आरएचएस की तरह नहीं दिखते हैं!"। अधिकतम मान दूसरे तर्क कारक द्वारा परिभाषित श्रेणियों के भीतर 'मान' सूचियों को असाइन किया गया है।

(मैं आप प्रश्न के लिए धन्यवाद करते हैं। मुझे एहसास हुआ नहीं था कि split<-ave के मूल में था। मुझे लगता है कि इसे और अधिक व्यापक रूप से इस्तेमाल की तुलना में मैंने महसूस किया है, क्योंकि मुझे लगता है कि ave एक अद्भुत उपयोगी कार्य है।)

+0

मैं देखता हूं। मेरा मुद्दा यह था कि मुझे एहसास नहीं हुआ कि 'विभाजित <-' स्वयं ही एक कार्य था। मुझे संदेह है कि इस समारोह का उपयोग कुछ बहुत चालाक, संक्षिप्त और कुशल कोड के लिए किया जा सकता है। आपके उत्तर के लिए धन्यवाद। – nograpes

+0

टाइप: विधियां (\ 'विभाजित <- \') –

1

बस a की परिभाषा, split(a, a$id)=1 प्रदर्शन के बाद, परिणाम होगा:

> a 
    id value 
1 1  1 
2 1  1 
3 1  1 
4 1  1 
+1

'विभाजन' संदर्भ द्वारा परिणाम नहीं लौटाता है। –

+0

@DWin धन्यवाद मैंने अपना जवाब – Ali

0

यहां महत्वपूर्ण यह है कि विभाजन < है - वास्तव में आरएचएस मूल्यों के साथ एलएचएस संशोधित।

> x <- c(1,2,3); 
> split(x,x==2) 
$`FALSE` 
[1] 1 3 
$`TRUE` 
[1] 2 
> split(x,x==2) <- split(c(10,20,30),c(10,20,30)==20) 
> x 
[1] 10 20 30 

नोट लाइन जहां मैं पुन: असाइन कर split(x,x==2) <-:

यहाँ एक उदाहरण है। यह वास्तव में x पुन: असाइन करता है।

के रूप में नीचे टिप्पणी में कहा गया है, तो आप ऊपर split<- की परिभाषा की तरह तो

> `split<-.default` 
function (x, f, drop = FALSE, ..., value) 
{ 
    ix <- split(seq_along(x), f, drop = drop, ...) 
    n <- length(value) 
    j <- 0 
    for (i in ix) { 
     j <- j%%n + 1 
     x[i] <- value[[j]] 
    } 
    x 
} 
<bytecode: 0x1e18ef8> 
<environment: namespace:base> 
+2

'विभाजित <-' कहा है जिसे कहा जा रहा है और यह आर –

+0

में लिखा गया है कि आप इसके लिए कोड कैसे प्रदर्शित करेंगे।कम से कम विभाजन के लिए, मैं बस "विभाजन" टाइप कर सकता हूं, और यह आउटपुट करता है: फ़ंक्शन (एक्स, एफ, ड्रॉप = गलत, ...) उपयोग विधि ("विभाजन") <बाइटकोड: 0x1fd29f8> <पर्यावरण: नामस्थान : आधार> – Arcymag

+0

और जोशुआ कहते हैं कि जोड़ने के लिए (आरएचएस पर) _does_ वापसी मान, और संदर्भ द्वारा पास नहीं होता है। –

संबंधित मुद्दे