Вложенный ifelse с функцией grepl в R - PullRequest
0 голосов
/ 06 декабря 2018

Я пытаюсь выполнить поиск в 3 различных листах Excel (фреймах данных), чтобы добавить 3 новых столбца в консолидированном фрейме данных.

df = Консолидированный фрейм данных, в котором я пытаюсь создать 3новые столбцы

df2 = фрейм данных (один столбец), где я ищу, чтобы получить столбец SheetName1 в df (столбец SheetName1 должен получиться, если строка df2 найдена в любых 5 столбцах из df, иначе "NA"

df3 = кадр ddata (один столбец), где я ищу, чтобы получить столбец Segregation & segregationRef в df (столбец сегрегации должен получиться, если в любых 5 столбцах найдена строка df3 из df, в противном случае столбец segregationRef "NA")должен привести к "NA", если строка найдена в столбце разделения. Я пробовал ниже, но не получал оптимальный результат.

df <- data.frame(Section=c("sheet1", "sheet11", NA, "sheet15"),
                 Level =c("(Level 1)", "(Level 1)", "sheet1", "(Level 1)", NA),
                 SAC=c(NA, NA, "sheet5", NA), 
                 Name=c(NA, "rohan", "vaibhav", "suresh"), 
                 COLL MGR=c(NA, NA, NA, "suresh"))

df2 <- data.frame(sheetname=c("sheet1", "sheet2", "sheet3", "sheet4"))
df3 <- data.frame(segregation=c("john", "naren", "suresh", "rohan"))
df$Sheetname1 <- "NA"

for (j in 1:nrow(df2)) {
  for (k in 1:nrow(df)) {
    df$Sheetname1[k]= 
      ifelse(grepl(df2$Sheetname[j],
                   paste(df$`Level`[k], df$SAC[k]), 
                   ignore.case=T),
             df2$Sheetname[j], df$Sheetname1[k])
  }
}

df$Segregation <- NA

for(l in 1:nrow(df3)){
  for(m in 1:nrow(df)){
    df$Segregation[m]=
      ifelse(grepl(df3$Segregation[l],
                   paste(df$`Level`[m], df$Name[m], 
                         df$COLL MGR[m], 
                         df$`COLL MGR`[m], 
                         df$`Collateral Manager`[m]),
                   ignore.case=T),
             df3$Segregation[l],
             df$Segregation[m])
  }
}

1 Ответ

0 голосов
/ 07 декабря 2018

Попробуй это.Он должен работать.Обратите внимание, что он просто вернет первое найденное совпадение.

df <- data.frame(Section = c("sheet1", "sheet11", NA, "sheet15"),
                 Level =c("(Level 1)", "(Level 1)", "sheet1", "(Level 1)"), 
                 SAC = c(NA, NA, "sheet5", NA), 
                 Name = c(NA, "rohan", "vaibhav", "suresh"), 
                 `COLL MGR` = c(NA, NA, NA, "suresh") )
df2 = data.frame(sheetname = c("sheet1", "sheet2", "sheet3", "sheet4")); 

df3 = data.frame(segregation = c("john", "naren", "suresh", "rohan"))

sheetname1<-apply(df,1,function(x){
  if(any(x %in% df2$sheetname))
    return(x[x %in% df2$sheetname][1])
  else
    return(NA_character_)
})


segregation<-apply(df,1,function(x){
  if(any(x %in% df3$segregation))
    return(x[x %in% df3$segregation][1])
  else
    return(NA_character_)
})

cbind(df,sheetname1,segregation)
#output:
# Section     Level    SAC    Name COLL.MGR sheetname1 segregation
# 1  sheet1 (Level 1)   <NA>    <NA>     <NA>     sheet1        <NA>
# 2 sheet11 (Level 1)   <NA>   rohan     <NA>       <NA>       rohan
# 3    <NA>    sheet1 sheet5 vaibhav     <NA>     sheet1        <NA>
# 4 sheet15 (Level 1)   <NA>  suresh   suresh       <NA>      suresh
...