首页 > 解决方案 > if_else 跨 R 中的多个列

问题描述

我正在使用一个函数(mutate_geocode),它输出两列数据,经度和纬度。因为 google api 需要大量花钱,所以我只希望它在我还没有经度和纬度的区域上运行地理编码功能。

library(dplyr)
problem <- tibble(location = c("Atlanta United States", "Paris France", "Rome Italy"),
lon = c(NA, 2.35, 12.49),
lat = c(NA, 48.86, 41.90))

我希望它最终看起来像这样(同样,无需在我已经拥有的区域上运行地理编码:

library(dplyr)
solution <- tibble(location = c("Atlanta United States", "Paris France", "Rome Italy"),
lon = c(-84.39, 2.35, 12.49),
lat = c(33.75, 48.86, 41.90))

为了到达那里,我尝试使用 if_else,但我似乎无法让它工作。

library(ggmap)
library(dplyr)
solution <- if_else(is.na(problem$lon) & is.na(problem$lat), true = mutate_geocode(problem$location), false = c(problem$lon & problem$lat))

我愿意接受解决方案并感谢您的时间!如果您还可以解释您的代码,那将来也会对我有所帮助。谢谢!

标签: rif-statementdplyrconditional-statementsggmap

解决方案


base::ifelse,dplyr::if_else要求结果与测试参数“相同的形状”。您的测试只是单列的向量,因此结果需要是单列的向量。由于您的结果是不同的形状,if_else因此对这项工作来说是一个不好的工具。

只需mutate_geocode在丢失的数据子集上运行:

is_missing = is.na(problem$lon) & is.na(problem$lat)  ## maybe you want `|` instead?
problem[is_missing , c("lon", "lat")] = mutate_geocode(problem[is_missing , "location"])

推荐阅读