将字符串附加到R中的文本

时间:2019-06-17 07:14:09

标签: r dplyr

我想在一个列中对满足条件的某些字符进行分类,并在另一列中将其他字符串联在一起。

分类有效。当“ col”列中为1时,程序必须将“ Category”(类别)中的输入与实际值进行比较。如果优先级数较小,则将该值保存在“ AlarmPrior”中,将另一个值保存在“ Other Alarms”中。我想将所有优先级较低的值连接到“其他警报”中的字符串中。

    #test the function 

    col <- c(0, 1, 0, 0, 1, 1)
    Priority <- c(1,2,3,4,5,6)
    Category <- c("a","b","c","d","e","f")
    eventlog_overlap.dt <- data.table(col,Priority, IEC_category)

    #loading the libraries
    library(magrittr) 
    library(dplyr)

    #comparison and value assignation in function of the priority

    eventlog_overlap.dt$OtherAlarms <- "" 
    eventlog_overlap.dt <- 
      eventlog_overlap.dt %>% 
        mutate(AlarmPrior = ifelse(col == 1,
                                      ifelse(Priority <= lag(Priority), 
                                               Category, 
                                               lag(Category)), NA),
               OtherAlarms = ifelse(col == 1,
                                    ifelse(Priority <= lag(Priority),
                                               "1",
                                               paste0(sprintf(Category,     lag(OtherAlarms)), collapse = ", ")),NA))

例如:

此输入

col <- c(0, 1, 0, 0, 1, 1)
Priority <- c(1,2,3,4,5,6)
Category <- c("a","b","c","d","e","f")

应返回:

             col      Priority      Category     OtherAlarms     AlarmPrior
    1         0          1             a             NA             NA
    2         1          2             b             b               a             
    3         0          3             c             b,c             NA
    4         0          4             d             b,c             NA
    5         1          5             e             b,c,e           d
    6         1          6             f             b,c,e,f         e

我的实际结果是这样:


             col      Priority      Category     OtherAlarms     AlarmPrior
    1         0          1             a             NA             NA
    2         1          2             b             a,b,c,d,e,f     a             
    3         0          3             c             NA              NA
    4         0          4             d             NA              NA
    5         1          5             e             a,b,c,d,e,f     d
    6         1          6             f             a,b,c,d,e,f     e

1 个答案:

答案 0 :(得分:0)

我用for语句解决了问题

col <- c(0, 1, 0, 0, 1, 1)
Priority <- c(1,2,3,4,5,6)
Category <- c("a","b","c","d","e","f")
eventlog_overlap.dt <- data.table(col,Priority, Category)

#loading the libraries
library(magrittr) 
library(dplyr)

#comparison and value assignation in function of the priority

eventlog_overlap.dt$OtherAlarms <- "" 
eventlog_overlap.dt <- 
  eventlog_overlap.dt %>%
  mutate(AlarmPrior = ifelse(col == 1,
                             ifelse(Priority <= lag(Priority), 
                                    Category, 
                                    lag(Category)), NA))



eventlog_overlap.dt$leadCate= lead(eventlog_overlap.dt$AlarmPrior)

tmpdata = character()
eventlog_overlap.dt$tmp= NA
for(i in 1:nrow(eventlog_overlap.dt)){

  tmp =  eventlog_overlap.dt[i,3]
  leadtmp = eventlog_overlap.dt[i,6]

  if(!is.na(leadtmp == tmp) & !as.logical(eventlog_overlap.dt$col[i])){

    tmp = tmp[!grepl(tmp,leadtmp)]
    tmp = ifelse(NROW(tmp)==0,NA,tmp)
    tmpdata = tmpdata
  } else{
    tmpdata = c(tmpdata,tmp)
  }

  eventlog_overlap.dt[i,7] = paste(tmpdata,collapse = ',')
 }

结果如下所示


> eventlog_overlap.dt

  col Priority Category OtherAlarms AlarmPrior leadCate     tmp
1
1   0        1        a                   <NA>        a        
2
2   1        2        b                      a     <NA>       b
3
3   0        3        c                   <NA>     <NA>     b,c
4
4   0        4        d                   <NA>        d     b,c
5
5   1        5        e                      d        e   b,c,e
6
6   1        6        f                      e     <NA> b,c,e,f