我想在一个列中对满足条件的某些字符进行分类,并在另一列中将其他字符串联在一起。
分类有效。当“ 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
答案 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