बल

2011-06-05 16 views
10

लौटने के लिए लागू होता है मेरे पास एक मैट्रिक्स और एक फ़ंक्शन है जो वेक्टर लेता है और एक मैट्रिक्स देता है। मैं मैट्रिक्स की सभी पंक्तियों में फ़ंक्शन को लागू करना चाहता हूं और सभी परिणामों को एक साथ जोड़ना चाहता हूं। उदाहरण के लिएबल

mat <- matrix(1:6, ncol=2) 
f <- function (x) cbind(1:sum(x), sum(x):1) 
do.call(rbind, apply(mat, 1, f)) 

यह पूरी तरह से काम करता है क्योंकि लौटा मैट्रिस की पंक्तियों की अलग-अलग संख्या होती है, इसलिए एक सूची लौटाती है। लेकिन अगर वे पंक्तियों की एक ही नंबर है को भी हो यह अब और काम नहीं करता:

mat <- f(3) 
apply(mat, 1, f) 

लागू रिटर्न एक मैट्रिक्स है जहाँ से मैं परिणाम मैं चाहता हूँ नहीं मिल सकता है। क्या एक सूची वापस करने के लिए आवेदन करना संभव है या कोई और समाधान है?

उत्तर

13

फ़ंक्शन f लागू करने से पहले आपको मैट्रिक्स चटाई को विभाजित करना होगा।

list_result <- lapply(split(mat,seq(NROW(mat))),f) 
matrix_result <- do.call(rbind,list_result) 
+0

यह काम करता है। मुझे विभाजन समारोह के बारे में पता नहीं था। धन्यवाद! – mosaic

+0

यह आपको समस्याओं में चलाता है जब आपको खाली मैट्रिक्स को संभालना होता है क्योंकि seq (0) c (1,0) देता है। – meow

17

यही कारण है कि मुझे plyr पैकेज पसंद है। इसमें --ply फ़ंक्शन हैं जो सभी एक ही तरीके से काम करते हैं। पहला पत्र इनपुट के रूप में आपके पास है और दूसरा तरीका आउटपुट के रूप में आपके पास है (l सूचियों के लिए, a एरे के लिए, d डेटा फ्रेम के लिए)।

तो alply() समारोह apply() के लिए इसी तरह काम करता है, लेकिन हमेशा एक सूची प्रस्तुत करती है:

alply(mat, 1, f) 
संबंधित मुद्दे