मेरे पास वित्तीय विवरणों का डेटाफ्रेम है। डेटाफ़्रेम लंबे प्रारूप में है और मुझे नए मानों की गणना करने के लिए इसे एक विस्तृत डेटाफ़्रेम में बदलने की आवश्यकता है। कुछ मान, Gross Margin before Incentives और Cash Incentives, item कॉलम में डुप्लीकेट हैं, लेकिन वे सभी अपने संबंधित Gross Margin before Incentives मानों के ऊपर स्ट्रिंग में पहले शब्द द्वारा दर्शाए गए समूहों से संबंधित हैं। . यह एक उदाहरण है कि मेरा डेटा कैसा दिखता है:

item                           balance
  <chr>                            <dbl>
1 Happy Sales                    538246.
2 Happy COGS                     691013.
3 Gross Margin before Incentives 732979.
4 Cash Incentives                795271.
5 Sad Sales                      777362.
6 Sad COGS                       641143.

मुझे item कॉलम में Gross Margin before Incentives और Cash Incentives मानों का नाम बदलने की जरूरत है, Gross Margin before Incentives के ऊपर के मान में पहले शब्द के साथ। उदाहरण के लिए, item, Gross Margin before Incentives और Cash Incentives में पंक्ति 3 और पंक्ति 4, Happy Gross Margin before Incentives और Happy Cash Incentives होनी चाहिए। ऐसे उदाहरण हैं जहां Cash Incentives किसी समूह में नहीं देखा जाता है।

मैं Gross Margin before Incentives और Cash Incentives के उदाहरणों का नाम कैसे बदल सकता हूं जब यह घटित होता है? मैंने डेटा को केवल item में शामिल करने के लिए सब्मिट करके शुरू किया था जिसे मुझे ठीक करने की आवश्यकता है।

मेरा कोड अब तक:

# subset the data 

strings_to_clean <- c("Sales", "COGS", "Gross Margin before Incentives", "Cash Incentives")
subset_data <- subset(example, grepl(paste(strings_to_clean, collapse="|"), item))

आंकड़े:

structure(list(item = c("Happy Sales", "Happy COGS", "Gross Margin before Incentives", 
"Cash Incentives", "Sad Sales", "Sad COGS", "Gross Margin before Incentives", 
"Cash Incentives", "Moody Sales", "Moody COGS", "Gross Margin before Incentives", 
"Cash Incentives", "Quiet Sales", "Quiet COGS", "Gross Margin before Incentives", 
"Loud Sales", "Loud COGS", "Gross Margin before Incentives"), 
    balance = c(538245.742201671, 691013.302590931, 732979.295329896, 
    795270.513380734, 777362.375851466, 641142.897993899, 631125.453588359, 
    719267.992685639, 691097.434737858, 787648.5870127, 773735.724156151, 
    839982.810591622, 594245.171673631, 817496.544758698, 696496.677601699, 
    640577.505041572, 715166.623728619, 646765.952258766)), row.names = c(NA, 
-18L), class = c("tbl_df", "tbl", "data.frame"))
0
gm007 25 मार्च 2021, 04:53

2 जवाब

सबसे बढ़िया उत्तर

यहाँ एक दृष्टिकोण है। आप ऐसा कर सकते हैं:

  1. प्रत्येक आइटम का पहला शब्द प्राप्त करें
  2. strings_to_clean की सूची का उपयोग करके तय करें कि पहला शब्द उपसर्ग है या नहीं
  3. उन पंक्तियों के लिए पिछले उपसर्ग में जोड़ने के लिए fill का उपयोग करें जिनमें उपसर्ग गायब हैं
  4. नए उपसर्गों को मूल मदों में संयोजित करें।

मैंने हेल्पर कॉलम को अंदर छोड़ दिया और स्पष्टता के लिए वर्बोज़ था, लेकिन इनमें से कुछ चरणों को आसानी से संक्षिप्त किया जा सकता था।

library(tidyverse)

subset_data <- structure(list(item = c("Happy Sales", "Happy COGS", "Gross Margin before Incentives", "Cash Incentives", "Sad Sales", "Sad COGS", "Gross Margin beforeIncentives", "Cash Incentives", "Moody Sales", "Moody COGS", "Gross Margin before Incentives", "Cash Incentives", "Quiet Sales", "Quiet COGS", "Gross Margin before Incentives", "Loud Sales", "Loud COGS", "Gross Margin before Incentives"), balance = c(538245.742201671, 691013.302590931, 732979.295329896, 795270.513380734, 777362.375851466, 641142.897993899, 631125.453588359, 719267.992685639, 691097.434737858, 787648.5870127, 773735.724156151, 839982.810591622, 594245.171673631, 817496.544758698, 696496.677601699, 640577.505041572, 715166.623728619, 646765.952258766)), row.names = c(NA, -18L), class = c("tbl_df", "tbl", "data.frame"))

subset_data %>%
  mutate(
    first_word = str_extract(item, "^.*? "),
    has_prefix = !first_word %in% c("Sales ", "COGS ", "Gross ", "Cash "),
    prefix = if_else(has_prefix, first_word, NA_character_)
  ) %>%
  fill(prefix) %>%
  mutate(
    prefix_to_add = if_else(has_prefix, "", prefix),
    item = str_c(prefix_to_add, item)
  )
#> # A tibble: 18 x 6
#>    item                      balance first_word has_prefix prefix  prefix_to_add
#>    <chr>                       <dbl> <chr>      <lgl>      <chr>   <chr>        
#>  1 Happy Sales               538246. "Happy "   TRUE       "Happy… ""           
#>  2 Happy COGS                691013. "Happy "   TRUE       "Happy… ""           
#>  3 Happy Gross Margin befor… 732979. "Gross "   FALSE      "Happy… "Happy "     
#>  4 Happy Cash Incentives     795271. "Cash "    FALSE      "Happy… "Happy "     
#>  5 Sad Sales                 777362. "Sad "     TRUE       "Sad "  ""           
#>  6 Sad COGS                  641143. "Sad "     TRUE       "Sad "  ""           
#>  7 Sad Gross Margin beforeI… 631125. "Gross "   FALSE      "Sad "  "Sad "       
#>  8 Sad Cash Incentives       719268. "Cash "    FALSE      "Sad "  "Sad "       
#>  9 Moody Sales               691097. "Moody "   TRUE       "Moody… ""           
#> 10 Moody COGS                787649. "Moody "   TRUE       "Moody… ""           
#> 11 Moody Gross Margin befor… 773736. "Gross "   FALSE      "Moody… "Moody "     
#> 12 Moody Cash Incentives     839983. "Cash "    FALSE      "Moody… "Moody "     
#> 13 Quiet Sales               594245. "Quiet "   TRUE       "Quiet… ""           
#> 14 Quiet COGS                817497. "Quiet "   TRUE       "Quiet… ""           
#> 15 Quiet Gross Margin befor… 696497. "Gross "   FALSE      "Quiet… "Quiet "     
#> 16 Loud Sales                640578. "Loud "    TRUE       "Loud " ""           
#> 17 Loud COGS                 715167. "Loud "    TRUE       "Loud " ""           
#> 18 Loud Gross Margin before… 646766. "Gross "   FALSE      "Loud " "Loud "

2021-03-24 को reprex पैकेज द्वारा बनाया गया (v1.0.0)

1
Calum You 25 मार्च 2021, 05:16

dplyr पैकेज का उपयोग करके आप डेटा की नियमित संरचना का फायदा उठाकर ऐसा कर सकते हैं

library(dplyr)
# define vector of strings to use 
strings_to_clean <- 
    c("Sales", "COGS", "Gross Margin before Incentives", "Cash Incentives")
# code
df %>% 
    mutate(item = 
               ifelse(grepl(paste0(strings_to_clean[3:4], collapse = "|"), item), 
                      paste(gsub(paste0(c(strings_to_clean, "\\s+$"), collapse = "|"), "", lag(item, 2)), item), 
                      item))

यह मूल रूप से कह रहा है

(1) यदि item के पास 'प्रोत्साहन से पहले सकल मार्जिन' या 'नकद प्रोत्साहन' है

(२) दो पंक्तियों से फर्म के नाम को item से जोड़ना (lag(item, 2)) : आप lag(item, 2) लेकर और strings_to_clean से सभी स्ट्रिंग्स को हटाकर फर्म का नाम ढूंढते हैं।

1
Hong 25 मार्च 2021, 05:33