2011-08-05 9 views
5

"लागू" दस्तावेज़ में उल्लेख किया गया है कि "कहां 'एक्स ने dimnames नाम दिया है, यह आयाम नाम चुनने वाला एक वर्ण वेक्टर हो सकता है।" मैं केवल विशेष कॉलम के लिए डेटा.फ्रेम पर आवेदन करना चाहता हूं। क्या मैं ऐसा करने के लिए dimnames सुविधा का उपयोग कर सकता हूँ?आर त्रुटि लागू करें: 'एक्स' का नाम dimnames

मुझे एहसास है कि मैं केवल सब्सक्राइब कर सकता हूं() एक्स केवल रुचि के कॉलम को शामिल करने के लिए, लेकिन मैं "नामित नाम" बेहतर समझना चाहता हूं।

> x <- data.frame(cbind(1,1:10)) 
> apply(x,2,sum) 
X1 X2 
10 55 
> apply(x,c('X2'),sum) 
Error in apply(x, c("X2"), sum) : 'X' must have named dimnames 
> dimnames(x) 
[[1]] 
[1] "1" "2" "3" "4" "5" "6" "7" "8" "9" "10" 

[[2]] 
[1] "X1" "X2" 
> names(x) 
[1] "X1" "X2" 
> names(dimnames(x)) 
NULL 

उत्तर

4

का उपयोग अगर मैं तुम्हें सही ढंग से समझ, आप केवल कुछ स्तंभों पर लागू होते हैं का उपयोग करना चाहते है। यह नामित नामनामों का नाम क्या होगा। मैट्रिक्स या डेटा.फ्रेम पर लागू फ़ंक्शन हमेशा सभी पंक्तियों या सभी कॉलम पर लागू होता है। आप यह कर सकता है,

m <- matrix(1:12,4, dimnames=list(foo=letters[1:4], bar=LETTERS[1:3])) 
apply(m, "bar", sum) # Use "bar" instead of 2 to refer to the columns 

लेकिन यदि आप कॉलम नाम आप पर लागू करना चाहते हैं: नामित dimnames आप "सामान्य" 1 और 2 के बजाय नाम से पंक्तियों या स्तंभों का उपयोग करने के चुनने की अनुमति देता पहले चुनकर केवल उन स्तंभों:

n <- c("A","C") 
apply(m[,n], 2, sum) 
# A C 
#10 42 

नाम dimnames की कि dimnames एक matrix या array में "dimnames" विशेषता में एक सूची के रूप में जमा हो जाती एक पक्ष प्रभाव है। सूची का प्रत्येक घटक एक आयाम से मेल खाता है और इसका नाम दिया जा सकता है। यह बहुआयामी सरणी के लिए शायद अधिक उपयोगी है ...

data.frame के लिए, कोई "dimnames" विशेषता नहीं है। एक data.frame अनिवार्य रूप से एक सूची है, इसलिए सूची के "नाम" विशेषता कॉलम नामों से मेल खाते हैं, और अतिरिक्त "पंक्ति.नाम" विशेषता पंक्ति नामों से मेल खाती है। इस वजह से, नाम नामों के नामों को स्टोर करने के लिए कोई जगह नहीं है (वे निश्चित रूप से इसके लिए अतिरिक्त विशेषता प्राप्त कर सकते हैं, लेकिन उन्होंने नहीं किया)। जब आप डेटा.फ्रेम पर dimnames फ़ंक्शन को कॉल करते हैं, तो यह बस "row.names" और "names" विशेषताओं से एक सूची बनाता है।

2

मुद्दा यह है कि आप किसी कारण से सीधे x की dimnames हेरफेर नहीं कर सकते हैं और x एक मैट्रिक्स जो नामित dimnames संरक्षण नहीं है करने के लिए मजबूर हो जाएगा:

नीचे कुछ नमूना कोड है ।

एक समाधान पहले एक मैट्रिक्स के लिए मजबूर करने के लिए है, तो dimnames नाम दें और apply()

> X <- as.matrix(x) 
> str(X) 
num [1:10, 1:2] 1 1 1 1 1 1 1 1 1 1 ... 
- attr(*, "dimnames")=List of 2 
    ..$ : chr [1:10] "1" "2" "3" "4" ... 
    ..$ : chr [1:2] "X1" "X2" 
> dimnames(X) <- list(C1 = dimnames(x)[[1]], C2 = dimnames(x)[[2]]) 
> str(X) 
num [1:10, 1:2] 1 1 1 1 1 1 1 1 1 1 ... 
- attr(*, "dimnames")=List of 2 
    ..$ C1: chr [1:10] "1" "2" "3" "4" ... 
    ..$ C2: chr [1:2] "X1" "X2" 
> apply(X, "C1", mean) 
    1 2 3 4 5 6 7 8 9 10 
1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0 5.5 
> rowMeans(X) 
     1 2 3 4 5 6 7 8 9 10 
1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0 5.5 
+0

@Tommy नोट्स के रूप में, आप जो भी आप इस दृष्टिकोण के माध्यम से करना चाहते हैं वह नहीं कर सकते हैं, आप केवल उस आयाम का नाम दे सकते हैं जिस पर 'FUN' लागू होता है। मैंने उत्तर को आपके क्यू के नामित dimnames बिट द्वारा क्या मतलब था इसका एक स्पष्टीकरण के रूप में पोस्ट किया। –

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