2016-06-10 9 views
5

मैं एक कस्टम समारोह के अंदर tidyr::gather() कॉल करने के लिए, करने के लिए जो मैं चरित्र चर key और value कॉलम का नाम बदलने के लिए इस्तेमाल किया जाएगा की एक जोड़ी से पारित करना चाहते हैं। जैसेकुंजी/मूल्य कॉलम का नाम बदलने के लिए tidyr के इकट्ठा करने के लिए परिवर्तनीय पास?

myFunc <- function(mydata, key.col, val.col) { 
    new.data <- tidyr::gather(data = mydata, key = key.col, value = val.col) 
    return(new.data)  
} 

हालांकि, यह वांछित के रूप में काम नहीं करता है।

temp.data <- data.frame(day.1 = c(20, 22, 23), day.2 = c(32, 22, 45), day.3 = c(17, 9, 33)) 

# Call my custom function, renaming the key and value columns 
# "day" and "temp", respectively 
long.data <- myFunc(mydata = temp.data, key.col = "day", val.col = "temp") 

# Columns have *not* been renamed as desired 
head(long.data) 
    key.col val.col 
1 day.1  20 
2 day.1  22 
3 day.1  23 
4 day.2  32 
5 day.2  22 
6 day.2  45 

वांछित उत्पादन:

head(long.data) 
    day temp 
1 day.1 20 
2 day.1 22 
3 day.1 23 
4 day.2 32 
5 day.2 22 
6 day.2 45 

मेरे समझ के साथ कि gather() सबसे तर्क के लिए नंगे चर नाम का उपयोग करता है (इस उदाहरण में के रूप में यह है, स्तंभ नाम के रूप में "key.col" का उपयोग कर के रूप में मूल्य करने का विरोध किया है key.col में संग्रहीत)। मैंने gather() कॉल में मूल्य पारित करने के कई तरीकों का प्रयास किया है, लेकिन अधिकांश रिटर्न त्रुटियां। उदाहरण के लिए, myFunc वापसी Error: Invalid column specification (अनदेखी, निदर्शी प्रयोजनों के लिए, value पैरामीटर, जो समान व्यवहार है) के भीतर gather() कॉल के इन तीन वेरिएंट:

gather(data = mydata, key = as.character(key.col) value = val.col) 

gather(data = mydata, key = as.name(key.col) value = val.col) 

gather(data = mydata, key = as.name(as.character(key.col)) value = val.col) 

समाधान के लिए, मैं सिर्फ कॉल निम्न स्तंभ का नाम बदलने gather() रहे हैं:

colnames(long.data)[colnames(long.data) == "key"] <- "day" 

लेकिन कुंजी/मान स्तंभ का नाम बदलने के लिए gather() की कथित कार्यक्षमता को देखते हुए, मैं कैसे एक कस्टम समारोह के भीतर gather() कॉल में ऐसा कर सकते हैं?

+0

पढ़ें '? Gather' और" इन्हें भी देखें "अनुभाग पर ध्यान देते हैं। फिर उपयुक्त फ़ंक्शन नाम को गुगल करने से आपको [यह] (http://stackoverflow.com/q/26429582/324364) हो सकता है। – joran

उत्तर

1

एक समारोह तुम इतनी तरह gather_() का उपयोग करना पड़ में कहें।

myFunc <- function(mydata, key.col, val.col, gather.cols) { 
    new.data <- gather_(data = mydata, 
         key_col = key.col, 
         value_col = val.col, 
         gather_cols = colnames(mydata)[gather.cols]) 
    return(new.data)  
} 

temp.data <- data.frame(day.1 = c(20, 22, 23), day.2 = c(32, 22, 45), 
day.3 = c(17, 9, 33)) 
temp.data 


    day.1 day.2 day.3 
1 20 32 17 
2 22 22  9 
3 23 45 33 

# Call my custom function, renaming the key and value columns 
# "day" and "temp", respectively 

long.data <- myFunc(mydata = temp.data, key.col = "day", val.col = 
"temp", gather.cols = 1:3) 
# Columns *have* been renamed as desired 
head(long.data) 

    day temp 
1 day.1 20 
2 day.1 22 
3 day.1 23 
4 day.2 32 
5 day.2 22 
6 day.2 45 

कहा गया है, मुख्य अंतर यह है gather_ कॉलम gather_cols तर्क के साथ इकट्ठा करना चाहते हैं निर्दिष्ट करने की आवश्यकता है।

+1

ग्रेट स्पष्टीकरण। मुझे एहसास नहीं हुआ कि विकम ने इस तरह की शक्ति के साथ नम्र अंडरस्कोर को प्रभावित किया था। – Jeff

1

अधिकांश (यदि नहीं सभी) हेलडे के कार्य जो तर्कसंगत नामों जैसे कि dplyr के कार्यों के रूप में उपयोग करते हैं) function_ संस्करण है जो नियमित मूल्यांकन का उपयोग करता है और "प्रोग्रामिंग के लिए उपयुक्त" है। तो, तुम क्या जरूरत है तो बस होना चाहिए:

myFunc <- function(mydata, key.col, val.col) { 
    tidyr::gather_(data = mydata, key_col = key.col, 
       value_col = val.col, gather_cols = colnames(mydata))   
} 

केवल "पकड़" यहाँ है कि यह gather_cols है, जो आवश्यक नहीं है जब gather का उपयोग कर या ... के रूप में अलग से किया जा सकता है निर्दिष्ट करने के लिए अनिवार्य है।

और फिर:

> myFunc2(mydata = temp.data, key.col = "day", val.col = "temp") 
    day temp 
1 day.1 20 
2 day.1 22 
3 day.1 23 
4 day.2 32 
5 day.2 22 
6 day.2 45 
7 day.3 17 
8 day.3 9 
9 day.3 33 
+0

अच्छी व्याख्या; 'collect_cols' को शामिल करना विचारशील था। – Jeff

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