R:使用带有grepl条件的if语句处理列中的数据

问题描述 投票:0回答:2
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 if-statement grepl
2个回答
1
投票

这里是一个基本的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')

0
投票

您有一些问题:

© www.soinside.com 2019 - 2024. All rights reserved.