Создание нового столбца с условием dplyr :: if_else в R - PullRequest
1 голос
/ 14 марта 2019

Я написал следующий код для создания нового столбца на основе определенных условий в предыдущем столбце. Я считаю, что мне нужно добавить дополнительное условие, чтобы сохранить предыдущие значения.

BP2018_spread <- BP2018_spread  %>%
 dplyr :: mutate(Period_Type = if_else(grepl("QTD",BP2018_spread$Month), 'QTD', if_else(grepl("YTD",BP2018_spread$Month),'YTD', 'NA')))

Current Output:
       Month      Period_Type
       <chr>      <chr>      
     1 " Apr"     NA         
     2 " Apr QTD" QTD        
     3 " Apr YTD" YTD        
     4 " Aug"     NA         
     5 " Aug QTD" QTD        
     6 " Aug YTD" YTD        
     7 " Dec"     NA         
     8 " Dec QTD" QTD        
     9 " Dec YTD" YTD        
    10 " Feb"     NA  


Desired Output:
   Month      Period_Type
       <chr>      <chr>      
     1 " Apr"     Apr         
     2 " Apr QTD" QTD        
     3 " Apr YTD" YTD        
     4 " Aug"     Aug         
     5 " Aug QTD" QTD        
     6 " Aug YTD" YTD        
     7 " Dec"     Dec         
     8 " Dec QTD" QTD        
     9 " Dec YTD" YTD        
    10 " Feb"     Feb   

ИЛИ

Desired Output:
       Month      Period_Type
           <chr>      <chr>      
         1 " Apr"     MTD         
         2 " Apr QTD" QTD        
         3 " Apr YTD" YTD        
         4 " Aug"     MTD         
         5 " Aug QTD" QTD        
         6 " Aug YTD" YTD        
         7 " Dec"     MTD         
         8 " Dec QTD" QTD        
         9 " Dec YTD" YTD        
        10 " Feb"     MTD   

Ответы [ 5 ]

2 голосов
/ 14 марта 2019

Используйте case_when, что позволяет избежать записи нескольких инкапсулированных if_else операторов:

BP2018_spread <- data.frame(
  Month = c(
    " Apr",
    " Apr QTD",
    " Apr YTD",
    " Aug",
    " Aug QTD",
    " Aug YTD",
    " Dec",
    " Dec QTD",
    " Dec YTD",
    " Feb"
  ))

BP2018_spread %>% 
mutate(Period_Type=case_when(grepl("QTD",BP2018_spread$Month) ~ 'QTD',
                             grepl("YTD",BP2018_spread$Month) ~ 'YTD',
                             TRUE ~ as.character(Month)))

Выход:

      Month Period_Type
1       Apr         Apr
2   Apr QTD         QTD
3   Apr YTD         YTD
4       Aug         Aug
5   Aug QTD         QTD
6   Aug YTD         YTD
7       Dec         Dec
8   Dec QTD         QTD
9   Dec YTD         YTD
10      Feb         Feb
2 голосов
/ 14 марта 2019

Можете ли вы попробовать

    BP2018_spread <- BP2018_spread  %>%
                     dplyr::mutate(Period_Type = ifelse(grepl("QTD", Month), 'QTD',
                     ifelse(grepl("YTD", Month),'YTD', 'MTD')))
1 голос
/ 14 марта 2019

Я думаю, что это может помочь:

BP2018_spread %>% 
  mutate(Period_Type = if_else(grepl("QTD",Period_Type) | grepl("YTD",Period_Type),
                               as.character(Period_Type),
                              as.character(Month) ))

Используя эти данные:

#reproduce your dataset
BP2018_spread <- data.frame(
  Month = c(
    " Apr",
    " Apr QTD",
    " Apr YTD",
    " Aug",
    " Aug QTD",
    " Aug YTD",
    " Dec",
    " Dec QTD",
    " Dec YTD",
    " Feb"
  ),
  Period_Type = c(NA,
                  "QTD",
                  "YTD",
                  NA,
                  "QTD",
                  "YTD",
                  NA,
                  "QTD",
                  "YTD",
                  NA)
)
0 голосов
/ 14 марта 2019

Введите

BP2018_spread <- tibble(
  Month = c(
    " Apr",
    " Apr QTD",
    " Apr YTD",
    " Aug",
    " Aug QTD",
    " Aug YTD",
    " Dec",
    " Dec QTD",
    " Dec YTD",
    " Feb"
  )
)

Выход 1

BP2018_spread %>% 
  mutate(Period_Type = if_else(
    grepl("QTD", Month),'QTD',
  if_else(grepl("YTD", Month),'YTD',
    trimws(Month)
  )))

OR

BP2018_spread %>%
  mutate(Period_Type = case_when(
    grepl("QTD", Month) ~ 'QTD',
    grepl("YTD", Month) ~ 'YTD',
    TRUE ~ trimws(Month)
  ))

Выход 2

BP2018_spread %>% 
  mutate(Period_Type = if_else(
    grepl("QTD", Month),'QTD',
  if_else(grepl("YTD", Month),'YTD',
    'MTD'
  )))

OR

BP2018_spread %>%
  mutate(Period_Type = case_when(
    grepl("QTD", Month) ~ 'QTD',
    grepl("YTD", Month) ~ 'YTD',
    TRUE ~ 'MTD'
  ))

В обоих случаях я использовал trimws для обрезки пробелов, также вам не нужно BP2018_spread$, так как mutate понимает имена столбцов. Второй вариант кода под каждым выводом использует case_when, который легче писать и понимать.

0 голосов
/ 14 марта 2019

Вы можете попробовать этот метод также

df <- read.csv("D:/X-tras/stackoverflow/STACK_YTD.csv",header = T)

v<- c("QTD","YTD")

df <- df %>%
  mutate(final = ifelse(grepl("YTD|QTD",Period_Type), str_extract(Period_Type, str_c(v, collapse = "|")), "MTD"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...