longtidue <- c('517W', '595W', '433W', '450E', '659E', '682W', '678W', '546E', '462W', '500W')
latitude <- c('291N','202N', '276N', '269S', '279N', '294N', '252N', '254S', '248N', '258N')
df <- data.frame(latitude, longitude)
是我正在使用的数据库的示例,该数据库处理以以下格式出现的经度和纬度坐标:
240N,707W,267S,130E
我需要处理这些坐标,以便可以在采用以下形式的坐标的模型中使用它们:
24.0,-70.7,-26.7,13.0
((在模型中,北部和东部被视为正方向。)
目标是能够遍历整个列,并确定单元格中是否存在“ N”或“ S”。我要从那里删除字母,然后将剩余的数字除以10或-10,以给出正确的符号。如果该列中既没有N也没有S,则我希望代码不留下单元格,这就是我在下面发布的示例代码结尾处else语句的原因。为了处理列中的所有数据,我尝试使用elseif语句,但是我不确定如何使它工作。我结束于一个for循环,条件是如下所示:
for (i in 1:nrow(df)) {
if (grepl("N",df$latitude, fixed = TRUE)) {
df$latitude <- gsub("N", "",df$latitude) & df$latitude <- df$latitude/(10)
} else if (grepl("S",df$latitude, fixed = TRUE)) {
df$latitude <- gsub("S", "",df$latitude) & df$latitude <- as.numeric(df$latitude) & df$latitude <- df$latitude/(-10)
} else (df$latitude)
}
但是这会给我df $ latitude /(10)一个错误,该错误是由于将数据从字符转换为数值(?)而引起的”二进制运算符的非数字参数”和/或警告“条件长度> 1,并且仅使用第一个元素”。我对R和堆栈溢出也很陌生,所以如果我的代码可以更好地格式化,请告诉我。
谢谢!
这里是一个基本的R选项。首先,我们可以通过以下方法计算纬度/经度值的绝对值:剥离最后一个方向字符,转换为数字,然后除以10。然后,有条件地翻转西,南方向的符号。
lng <- as.numeric(sub(".$", "", longitude)) / 10 lng <- ifelse(grepl("[WS]$", longitude), -1.0, 1.0) * lng lng [1] -51.7 -59.5 -43.3 45.0 65.9 -68.2 -67.8 54.6 -46.2 -50.0
数据:
longitude <- c('517W', '595W', '433W', '450E', '659E', '682W', '678W', '546E', '462W', '500W')
您有一些问题: