2015-01-12 5 views
5

मैं इस तरह चर के सेट के पास बहुत NAS साथ दो कारकों संक्षिप्त करने के लिए:कैसे सबसे अच्छा में एक चर

Var1 Var2 
"Asian"  NA 
    NA "Black" 
"White"  NA 

मैं आसानी से उन्हें इस रूप में प्राप्त करना चाहते हैं:

Race 
"Asian" 
"Black" 
"White" 

मैं की तरह कुछ कोशिश कर दिया गया है:

Race <- ifelse(is.na(Var1), Var2, Var1) 

लेकिन इस स्तर के लिए संख्या में मूल्यों बदल देता है, और न्यू mbers मिलान नहीं करते हैं (उदाहरण के लिए, 1, 1, 2 पैदा करता है)। क्या ऐसा करने का कोई सुविधाजनक तरीका है (आदर्श रूप से संक्षिप्त, आत्म-स्पष्टीकरण कोड के साथ)? (आप as.character के साथ इस से बाहर निकल सकते है, लेकिन वहाँ एक बेहतर तरीका हो गया है।)

+0

क्या आपको कारकों के साथ काम करना है? चरित्र प्रतिनिधित्व का उपयोग करके आप कर सकते हैं: 'pmax (Var1, Var2, na.rm = TRUE)' – thelatemail

+0

@thelatemail, मैंने अभी कोशिश की है, लेकिन यह मेरे लिए काम नहीं कर रहा है। क्या मुझे पहले सभी चरों में 'as.character' लागू करने की आवश्यकता है? – gung

+0

@thelatemail, ऐसा लगता है कि अगर मैं पहले 'as.character' करता हूं। यदि आप इसे सुविधाजनक फ़ंक्शन में टक कर सकते हैं, तो मैं इसे स्वीकार करूंगा। – gung

उत्तर

4

एक मध्यवर्ती रूपांतरण के साथ as.character के माध्यम से के बारे में:
यह मानते हुए है आपके डेटा:

dat <- data.frame(Var1=c("Asian",NA,"White"),Var2=c(NA,"Black",NA)) 

do.call(pmax,c(lapply(dat,as.character),na.rm=TRUE)) 
#[1] "Asian" "Black" "White" 

आप कर सकते हैं यदि आप किसी विशेष सबसेट पर काम करने की जरूरत है:

do.call(pmax,c(lapply(dat[c("Var1","Var2")],as.character),na.rm=TRUE)) 

as.character की जरूरत नहीं एक विकल्प होगा:

dat[cbind(1:nrow(dat),max.col(!is.na(dat)))] 
#[1] "Asian" "Black" "White" 
+0

असल में, मेरे डेटा फ्रेम में इस तरह के चर के कई सेट हैं। तो मैं इस तरह पूरे डीएफ पर काम नहीं कर सकता। मैंने एक साधारण कार्य लिखा: 'पतन <- फ़ंक्शन (v1, v2) pmax (as.character (v1), as.character (v2), na.rm = T) ', जो कि काम करने लगता है। – gung

+0

आपकी मदद के लिए धन्यवाद। – gung

+0

साफ विचार! यह उन परिस्थितियों में थोड़ा बेहतर हो सकता है जिनमें दो से अधिक स्तंभों को एक में ढहने की आवश्यकता है: 'लागू करें (डीएफ [सी ("Var1", "Var2")], 1, अधिकतम, na.rm = TRUE) ' –

2

क्या इस समाधान ?:

ind <- apply(df, 1, function(x) which(!is.na(x))) 
df[cbind(seq_along(ind), ind)] 
[1] "Asian" "Black" "White" 
+0

इसे शायद 'डीएफ [cbind (seq_len (nrow (df)), is.na (df $ Var1) + 1)]' (कम से कम 2 कॉलम के मामले में) के लिए सरलीकृत किया जा सकता है। – jbaums

+0

विचार के लिए धन्यवाद। – gung

1

एक अन्य समाधान (काफी अजीब मैं मानता हूँ और काफी छोटा है, अपने कॉलम चरित्र होने की जरूरत है, क्योंकि यह आपके उदाहरण में हो रहा है):

> library(tidyr) 
> unite(replace(df, is.na(df), ""), V, c(Var1, Var2), sep=''))$V 
#[1] "Asian" "Black" "White" 

या, यह gsub उपयोग करने के लिए जोखिम भरा हो सकता है, लेकिन यहाँ एनए तो सुरक्षित एक चरित्र श्रृंखला का एक हिस्सा है:

> gsub("NA", "", unite(df, V, c(Var1, Var2), sep='')$V) 
#[1] "Asian" "Black" "White" 
+0

टिप के लिए धन्यवाद। – gung

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