R, если is.na () - True, тогда выполнять функцию не работает; условие имеет длину> 1, и будет использоваться только первый элемент - PullRequest
0 голосов
/ 13 июня 2019

Я пытаюсь использовать оператор if, который говорит, что если значение равно .na, тогда выполнить функцию для другого столбца.

Я не могу заставить его работать, и я продолжаю получатьошибка:

  the condition has length > 1 and only the first element will be used

Я рассматривал другие вопросы, касающиеся операторов if, но мне не нужно заменять одно значение другим.Вместо этого мне нужно запустить функцию, если is.na () = TRUE, и функция, которую я использую (mutate_geocode), автоматически создает новые столбцы, поэтому мне не нужно назначать ее новому столбцу.Вот что я пытался:

library(dplyr)
library(ggmap)

Enrollment_Report2 <- if (is.na(Enrollment_Report$lon)) {
  mutate_geocode(facility_city)
}

Пример данных выглядит так:

library(dplyr)
Enrollment_Report <- tibble(facility_city = c("Atlanta", "Boston", "Tokyo"),
lon = c(NA, NA, 139.65),
lat = c(NA, NA, 35.68))

Ответы [ 3 ]

0 голосов
/ 13 июня 2019

Мне нужно открыть новый ответ, так как у меня недостаточно репутации, чтобы комментировать ответ akrun. Функция ifelse делает то, что вы ищете. Ошибка, которую вы получаете, заключается в том, что if ищет единственное значение, как указано выше, но вы передаете вектор. Вот небольшой пример:

a <- c(NA, 1, NA, 0)
if(is.na(a)){}
# NULL
# Warning message:
# In if (is.na(a)) { :
# the condition has length > 1 and only the first element will be used

Если вы вместо этого написали

result <- rep(NA, 4)
for(i in 1:length(a)){
  if(is.na(a[i])){
    result[i] <- 1
  } else {
    result[i] <- 0
  }
}
result
# [1] 1 0 1 0

вы не получите ошибку, потому что вы используете только единичные значения с if (). Теперь вместо использования цикла for и предложения if () else () вы можете просто использовать векторизованную функцию ifelse (), как предложено выше. Для каждого элемента вектора Enrollment_Report $ lon он проверяет, является ли оно значением NA, и если да, то применяет функцию mutate_geocode к Enrollment_Report $ facility_city, а если нет, он просто возвращает город обслуживания.

Enrollment_Report2 <- ifelse(is.na(Enrollment_Report$lon), mutate_geocode(Enrollment_Report$facility_city), Enrollment_Report$facility_city)

Это векторизованная версия if () {} else () {}.

0 голосов
/ 14 июня 2019

У меня нет Google API для тестирования, но я думаю, что это может сработать:

library(ggmap)
library(dplyr)
library(hablar)

Enrollment_Report %>% 
  mutate(geocode = if_else_(is.na(lon), geocode(facility_city), NA))
0 голосов
/ 13 июня 2019

Мы можем filter из строк NA и затем применить mutate_geocode

library(dplyr)
library(ggmap)
Enrollment_Report %>% 
   filter(is.na(lon)) %>%
   summarise(fac_city = list(facility_city), 
            out = list(geocode(facility_city))) %>% 
   unnest %>% 
   rename(facility_city = fac_city) %>% 
   bind_rows(Enrollment_Report %>%
   filter(!is.na(lon)))
# A tibble: 3 x 3
# facility_city   lon   lat
#  <chr>         <dbl> <dbl>
#1 Atlanta       -84.4  33.7
#2 Boston        -71.1  42.4
#3 Tokyo         140.   35.7

Или создать логический индекс и затем обновить строки

i1 <- is.na(Enrollment_Report$lon)
Enrollment_Report[i1, -1] <- geocode(Enrollment_Report$facility_city[i1])
Enrollment_Report
# A tibble: 3 x 3
#  facility_city   lon   lat
#  <chr>         <dbl> <dbl>
#1 Atlanta       -84.4  33.7
#2 Boston        -71.1  42.4
#3 Tokyo         140.   35.7
...