2010-03-30 19 views
24

अगर एक एक मैट्रिक्स की प्रत्येक पंक्ति को apply एक functon अर्थात करना चाहता है, लेकिन यह भी क्या इस कार्य के लिए एक तर्क के रूप उस पंक्ति की संख्या का उपयोग करना चाहता में स्तंभ काउंटर। उदाहरण के तौर पर, मान लीजिए कि आप मैट्रिक्स की प्रत्येक पंक्ति में संख्याओं की n-th रूट प्राप्त करना चाहते हैं, जहां n पंक्ति संख्या है। प्रारंभिक मैट्रिक्स में पंक्ति संख्या को बाध्यकारी करने की तुलना में क्या कोई दूसरा तरीका है (केवल apply का उपयोग करके)?पंक्ति/'लागू करें' कार्यों

test <- data.frame(x=c(26,21,20),y=c(34,29,28)) 

t(apply(cbind(as.numeric(rownames(test)),test),1,function(x) x[2:3]^(1/x[1]))) 

पी.एस. असल में अगर परीक्षण वास्तव में एक मैट्रिक्स था: test <- matrix(c(26,21,20,34,29,28),nrow=3), rownames (परीक्षण) :( मदद नहीं करता है धन्यवाद

+0

ध्यान दें कि आपके उदाहरण में आपको आवेदन की आवश्यकता नहीं है! –

+0

हां, मैं इसे देख सकता हूं :) असल में मैं रेखा संख्या से जुड़े पदों पर एक साजिश पर कुछ लाइनों को आकर्षित करना चाहता था। – Brani

उत्तर

26

क्या मैं आमतौर पर करते पंक्ति संख्या test के बजाय 1:nrow(test) पर sapply चलाने के लिए है, और test[i,] का उपयोग करें। समारोह के अंदर:।

t(sapply(1:nrow(test), function(i) test[i,]^(1/i))) 

मुझे यकीन है कि यह वास्तव में कुशल है, हालांकि नहीं कर रहा हूँ

+0

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

+0

सावधान - अगर nrow (test) == 0 तो यह 1 से 0 तक लूप होगा और परीक्षण [i,] असफल हो जाएगा – PeterVermont

2

वास्तव में, एक मैट्रिक्स के मामले में, तुम भी apply की जरूरत नहीं है बस:।

test^(1/row(test)) 

आप क्या चाहते हैं करता है, मुझे लगता है। मुझे लगता है कि row() फ़ंक्शन वह चीज़ है जिसे आप ढूंढ रहे हैं।

+0

मैं सहमत हूं, लेकिन प्रश्न के नीचे टिप्पणियों को देखें। – Brani

+1

हां, लेकिन मुझे अभी भी लगता है कि "पंक्ति()" फ़ंक्शन बिल्कुल वही है जो आपको चाहिए। – darrenjw

+0

फिर भी मैं नहीं देख सकता कि मैं इस 'लाइनों (परीक्षण [i,], सी (i, i)) जैसे 'लाइन्स' कमांड को लागू या बिना लूप के कैसे दे सकता हूं। 'लाइनें (सीआई, पंक्ति (सीआई)) – Brani

1

cbind() पंक्ति संख्या ing एक बहुत स्पष्ट दृष्टिकोण लगता है। एक मैट्रिक्स (या एक डेटा फ्रेम) के लिए निम्नलिखित काम करना चाहिए:

apply(cbind(1:(dim(test)[1]), test), 1, function(x) plot(x[-1], main=x[1])) 

या जो भी आप प्लॉट करने के लिए चाहते हैं।

3

आप समारोह एक नाम बल्कि यह गुमनाम बनाने से दे, तो आप तर्क और अधिक आसानी से पारित कर सकते हैं। पंक्तियों की संख्या प्राप्त करने के लिए हम पंक्तियों की संख्या प्राप्त करने के लिए nrow का उपयोग कर सकते हैं और पैरामीटर के रूप में पंक्ति संख्याओं का वेक्टर पास कर सकते हैं, फ्रेम को इस तरह से अनुक्रमित किया जा सकता है।

स्पष्टता के लिए मैंने एक अलग उदाहरण समारोह का उपयोग किया; इस उदाहरण में एक 2 स्तंभ मैट्रिक्स के लिए स्तंभ y द्वारा स्तंभ x गुणा:

test <- data.frame(x=c(26,21,20),y=c(34,29,28)) 
myfun <- function(position, df) { 
    print(df[position,1] * df[position,2]) 
} 

positions <- 1:nrow(test) 
lapply(positions, myfun, test) 
0

मैं एक छोटे से भ्रमित तो मुझे क्षमा करें यदि मैं इस गलत लेकिन आप प्रत्येक पंक्ति में संख्या के एन-वें जड़ बाहर काम करना चाहता हूँ एक मैट्रिक्स का जहां n = पंक्ति संख्या। इस यदि यह स्थिति तो इसकी बहुत आसान संबंधित पंक्ति संख्या के मान जैसे ही होने प्रत्येक स्तंभ के साथ मूल रूप में एक ही आयामों के साथ एक नई सरणी बनाने के लिए:

test_row_order = array(seq(1:length(test[,1]), dim = dim(test)) 

(एन-वें तब बस एक समारोह लागू इस मामले में जड़):

n_root = test^(1/test_row_order) 
संबंधित मुद्दे