繁体   English   中英

R如果is.na()为True则执行不起作用的函数; 条件的长度> 1,只使用第一个元素

[英]R if is.na() is True then perform a function not working; the condition has length > 1 and only the first element will be used

我正在尝试使用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))

我们可以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

我必须打开一个新答案,因为我没有足够的声誉评论akrun的回复。 ifelse函数可以满足您的需求。 您得到的错误是因为如果查找如上所述的奇异值,但您传入向量。 这是一个小例子:

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()的奇异值。 现在,您可以简单地使用上面建议的矢量化ifelse()函数,而不是使用for循环和if()else()子句。 对于向量Enrollment_Report $ lon的每个元素,它检查它是否是NA值,如果是,它在Enrollment_Report $ facility_city上应用函数mutate_geocode,如果不是,它只返回设施城市。

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

它是if(){} else(){}的矢量化版本。

我没有Google API进行测试,但我认为这可能会有效:

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

Enrollment_Report %>% 
  mutate(geocode = if_else_(is.na(lon), geocode(facility_city), NA))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM