Ошибка сценария R {: пропущено значение, в котором требуется ИСТИНА / ЛОЖЬ в кадре данных

1

У меня есть Data Frame, который выглядит так

Name  Surname  Country  Path
John   Snow      UK     /Home/drive/John 
BOB    Anderson         /Home/drive/BOB
Tim    David     UK     /Home/drive/Tim 
Wayne  Green     UK     /Home/drive/Wayne

Я написал сценарий, который сначала проверяет, имеет ли country =="UK", если это правда, "Путь" из "/Home/drive/" на "/Server/files/" с помощью gsub в R.

скрипт

Pattern<-"/Home/drive/"

Replacement<- "/Server/files/"



 for (i in 1:nrow(gs_catalog_Staging_123))
{

  if( gs_catalog_Staging_123$country[i] == "UK" && !is.na(gs_catalog_Staging_123$country[i]))   
  {
   gs_catalog_Staging_123$Path<- gsub(Pattern , Replacement , gs_catalog_Staging_123$Path,ignore.case=T)
  }

}

Выход я получаю:

    Name  Surname  Country  Path
John   Snow      UK     /Server/files/John 
*BOB    Anderson        /Server/files/BOB*
Tim    David     UK     /Server/files/Tim 
Wayne  Green     UK     /Server/files/Wayne

Выход, который я хочу

Name  Surname  Country  Path
    John   Snow      UK     /Server/files/John 
    BOB    Anderson         /Home/drive/BOB
    Tim    David     UK     /Server/files/Tim 
    Wayne  Green     UK     /Server/files/Wayne

Поскольку мы можем ясно видеть, что gsub не распознает недостающие значения и добавляет эту строку.

Теги:
scripting
rstudio
rscript

1 ответ

2
Лучший ответ

Многие функции R векторизованы, поэтому мы можем избежать цикла здесь.

# example data
df <- data.frame(
    name    = c("John", "Bob", "Tim", "Wayne"),
    surname = c("Snow", "Ander", "David", "Green"),
    country = c("UK", "", "UK", "UK"),
    path    = paste0("/Home/drive/", c("John", "Bob", "Tim", "Wayne")),
    stringsAsFactors = FALSE
)

# fix the path
df$newpath <- ifelse(df$country=="UK" & !is.na(df$country), 
                     gsub("/Home/drive/", "/Server/files/", df$path),
                     df$path)

# view result
df
   name surname country              path             newpath
1  John    Snow      UK  /Home/drive/John  /Server/files/John
2   Bob   Ander           /Home/drive/Bob     /Home/drive/Bob
3   Tim   David      UK   /Home/drive/Tim   /Server/files/Tim
4 Wayne   Green      UK /Home/drive/Wayne /Server/files/Wayne

На самом деле, это проблема с вашим кодом. Каждый раз через ваш цикл вы проверяете строку i но затем вы полностью заменяете весь столбец. Исправить было бы добавить [i] в соответствующие места вашей последней строки кода:

gs_catalog_Staging_123$Path[i] <- gsub(Pattern , Replacement , gs_catalog_Staging_123$Path[i] ,ignore.case=T)
  • 0
    Привет, так как я новичок в стеке оверов, я не могу поднять этот ответ, даже если я хочу. Я буду голосовать, как только я дам полномочия переполнением стека

Ещё вопросы

Сообщество Overcoder
Наверх
Меню