2017-07-21 8 views
8

मैं इस dataframe है, यह इस तरह दिखता है:सबस्ट्रिंग, एक लूप के बिना Dataframe में पैड और पेस्ट कॉलम

enter image description here

मैं कम से स्तंभ से पहले चरित्र लेने के लिए, एक में पूरे मूल्य की जरूरत है , फिर अंत में एक काउंटर डालें जो कॉलम ए में दोहराने के लिए वृद्धि करता है। यह काउंटर हमेशा तीन की लंबाई होना चाहिए।

enter image description here

तो कुछ भी नहीं है कि यहाँ नाटकीय, मैं निम्नलिखित कोड के साथ ऐसा करने में सक्षम था (तैयार प्रभावित होने के लिए):

library(stringr) 
tk <- "" 
for (i in 1:nrow(df)){ 
    if (tk == df$an[i]){ 
    counter <- counter + 1 
    } else { 
    tk <- df$an[i] 
    counter <- 1 
    } 
    df$ap[i] <- counter 
} 

df$ap <- paste0(substr(df$at, 1, 1), df$an, str_pad(df$ap, 3, pad="0")) 

मुझे ऐसा नहीं कर रहा हूँ अंतिम परिणाम यह है इस हार से संतुष्ट ऐसा लगता है कि बहुत "आर" नहीं है और मैं इसे दिन की रोशनी देखने की अनुमति नहीं देना चाहता हूं। मैं इसे और अधिक "आर" कैसे बना सकता हूं?

मैं सलाह की सराहना करता हूं।

+1

क्या आप पांच-पंक्ति उदाहरण के लिए 'ड्यूटी (डीएफ)' आउटपुट पोस्ट कर सकते हैं? – Frank

+1

ये सभी उत्तर मुझे बेहतर आर समझने में मदद करने में बहुत अच्छे हैं। मैं इनमें से प्रत्येक के लिए तकनीक सीखूंगा। लेकिन प्रतिष्ठित 'उत्तर' कौन प्राप्त करता है? मैं बस सबसे ऊपर के साथ जाने के इच्छुक हूं क्योंकि वे सभी महान हैं ... और dplyr जीतता है। – DieselBlue

उत्तर

8
library(stringr) 
library(dplyr) 
df1 <- df %>% 
      group_by(an) %>% 
      mutate(ap=paste0(substr(at, 1, 1), an, str_pad(row_number(), 3, pad="0"))) 

    at  an   ap 
1 NDA 023356 N023356001 
2 ANDA 023357 A023357001 
3 ANDA 023357 A023357002 
4 NDA 023357 N023357003 
5 ANDA 023398 A023398001 
3

यह काम करता है:

library(stringr)  
df = data.frame(at=c("NDA","ANDA","ANDA","NDA","ANDA"),an=c("023356","023357","023357","023357","023398"),stringsAsFactors = F) 

df$ap = paste0(substr(df$at,1,1), 
       df$an,str_pad(ave(df$an, df$an, FUN = seq_along),width=3,pad="0")) 

आउटपुट:

at  an   ap 
1 NDA 023356 N023356001 
2 ANDA 023357 A023357001 
3 ANDA 023357 A023357002 
4 NDA 023357 N023357003 
5 ANDA 023398 A023398001 

आशा इस मदद करता है!

+0

इस समाधान ने वास्तव में एक अलग समस्या हल की! धन्यवाद @ फ्लोरियन! – DieselBlue

+0

बढ़िया, खुश मैं मदद कर सकता था! – Florian

6

आधार आर में, आप sprintf पैड 0s और एवेन्यू के लिए इस तरह की गिनती प्राप्त करने के लिए उपयोग कर सकते हैं:

df$ap <- paste0(substr(df$at, 1, 1), df$an, 
       sprintf("%03.0f", as.numeric(ave(df$an, df$an, FUN=seq_along)))) 

ave समूह गणना और seq_along मायने रखता है पंक्तियों प्रदर्शन करती है।

जो data.table से

df 
    at  an   ap 
1 NDA 023356 N023356001 
2 ANDA 023357 A023357001 
3 ANDA 023357 A023357002 
4 NDA 023357 N023357003 
5 ANDA 023398 A023398001 
+0

ओपी "अंत में एक काउंटर है जो स्तंभ में दोहराने के लिए वृद्धि करता है" और समूह भी उनके लूप के साथ दोहराता है, लेकिन आपका दृष्टिकोण केवल समूह के लिए मूल्यों के साथ काम करता है, मानों की दोहराव नहीं करता है। शायद उनके डेटा को हल किया गया है और मैं यहां जो कह रहा हूं वह वास्तव में उनके लिए महत्वपूर्ण नहीं है, हालांकि। – Frank

+1

@ फ्रैंक सिर के लिए धन्यवाद। मुझे पोस्ट के पहले पढ़ने पर अतिरिक्त जटिलता नहीं मिली और यह उदाहरण में नहीं है, लेकिन मैं इस सप्ताह के अंत में एक दूसरा रूप लेगा। – lmo

8

rleid और rowid कार्यों रिटर्न यहाँ उपयोगी हो सकता है:

# using df from @Florian's answer 
library(data.table) 
setDT(df) 

df[, v := paste0(
    substr(at, 1, 1), 
    an, 
    sprintf("%03.f", rowid(rleid(an))) 
)] 

#  at  an   v 
# 1: NDA 023356 N023356001 
# 2: ANDA 023357 A023357001 
# 3: ANDA 023357 A023357002 
# 4: NDA 023357 N023357003 
# 5: ANDA 023398 A023398001 

यह कैसे काम करता:

  • आधार से प्रभावी ढंग से sprintf नौकरी करता है ओपी में stringr::str_pad का।
  • rleid समूह दोहराने वाले मानों को एक साथ चलाते हैं।
  • rowid प्रत्येक समूह के भीतर एक काउंटर बनाता है।
संबंधित मुद्दे