【问题标题】:How to update multiple entries in a single column in a loop如何在循环中更新单个列中的多个条目
【发布时间】:2021-02-09 09:18:34
【问题描述】:

我有两个数据框,一个具有正则表达式模式来从另一个搜索匹配的月份。

txn<-data.frame(S.No.=c(1,2),NARRATION=c("NET TXN: KBDEC17 SALARY DEC ","NET TXN: KBJAN19 SALARY"))
date_pattern<-data.frame(CODE=c("MONTH25","MONTH34"),
                         FORMAT=c("MmmYY","Mmm"),
                         ACTIVE=c("Y","Y"),
                         SEQNO=c(71,76),
                         REGEXPAT=c("(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)[1][6-9](?=[[:punct:]]|[[:space:]]|[[:alpha:]])"," (?<=[[:punct:]]|[[:space:]])(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)(?=[[:punct:]]|[[:space:]])"))

现在,当我运行循环时,它会将匹配的月份替换为“$”,但在某些情况下,我在字符串中发现了超过 1 个匹配值

date_pattern$SEQNO=as.numeric(date_pattern$SEQNO)
date_pattern <-  date_pattern[order(date_pattern$SEQNO),]

txn$MONTH<-NA

for (i in 1:length(date_pattern$REGEXPAT)) {
  pat <-  date_pattern$REGEXPAT[i]
  codetype <-  date_pattern$CODE[i]
  formattype <-  date_pattern$FORMAT[i]
  seq<-date_pattern$SEQNO[i]
  if(grepl("MONTH",codetype,ignore.case = T,perl = T)) {
    month_temp<-txn$MONTH
    result <- txn[grep(pat,ignore.case = T,txn$NARRATION,perl = T),]
    var  <-  as.character("MONTH")
    result <- result[is.na(result$MONTH),]
    res <- StrExtract(result$NARRATION,pat,ignore.case = T, perl = T)
    common <- intersect(txn$S.No.,result$S.No.)
    txn[common,][var] <- as.character(res)
    txn$NARRATION <- gsub(pat," $ ",txn$NARRATION, perl = T,ignore.case = T)
    txn$NARRATION <-  gsub("\\s+", " ", txn$NARRATION)
    print(paste(txn$NARRATION,pat,i,codetype,seq,sep = "--"))
  } else {print("Wrong Choice !!!!!!!") }
}

txn[is.na(txn)] <- ""

txn

现在,我得到的输出是:

   S.No.               NARRATION MONTH  
1     1 NET TXN: KB $ SALARY $  DEC17  
2     2    NET TXN: KB $ SALARY JAN19

但是,我需要这样的输出:

   S.No.               NARRATION MONTH  
1     1 NET TXN: KB $ SALARY $  DEC17,DEC  
2     2    NET TXN: KB $ SALARY JAN19

【问题讨论】:

    标签: r regex


    【解决方案1】:

    试试这个方法:

    library(dplyr)
    library(stringr)
    
    tidyr::crossing(txn, date_pattern) %>%
      mutate(MONTH = trimws(str_extract(NARRATION, REGEXPAT))) %>%
      group_by(S.No.) %>% 
      summarise(NARRATION = str_replace_all(first(NARRATION), 
                            paste0(MONTH, collapse = '|'), '$'),
                MONTH = toString(na.omit(MONTH)))
    
    #  S.No. NARRATION                MONTH     
    #  <dbl> <chr>                    <chr>     
    #1     1 "NET TXN: KB$ SALARY $ " DEC17, DEC
    #2     2 "NET TXN: KB$ SALARY"    JAN19     
    

    我们在NARRATION 的每个值中检查REGEXPAT 模式,并使用str_extract 提取。使用str_replace_all,我们将提取的模式替换为$

    【讨论】:

    • 我得到的输出是 ``` NARRATION MONTH 1 NET TXN: KB$ SALARY $ DEC17, DEC, JAN19
    • 对不起,我不明白你的评论。我的帖子中显示的输出有问题吗?
    • 我的意思是说,这段代码只返回第一个叙述,但我想要所有叙述的值以及合并的月份。
    • @PiyushSharma 我仍然不清楚。据我所知,我的答案与您显示的预期输出具有相同的输出。不确定缺少哪一部分。
    • 先生,使用相同的代码,我只得到叙述的第一条记录,因为它在命令和月份中连续写为:DEC17,DEC,JAN19,但这些可以显示为 2 行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-05
    • 2016-08-04
    • 2019-12-15
    • 1970-01-01
    • 2015-09-08
    • 2014-10-16
    相关资源
    最近更新 更多