【发布时间】:2026-01-27 04:25:02
【问题描述】:
我正在尝试更改纬度和经度列中的值。而不是南(纬度),我想放弃 S 并使数字为负。如果是North,我只想删除N。 我想对经度做同样的事情,然后去掉字母。我希望西方是消极的,东方是积极的。
Here is a snip of my data frame
请告诉我如何实现这一点!
【问题讨论】:
-
嗨。请阅读this,以便为您的问题和数据提供更好的示例。
我正在尝试更改纬度和经度列中的值。而不是南(纬度),我想放弃 S 并使数字为负。如果是North,我只想删除N。 我想对经度做同样的事情,然后去掉字母。我希望西方是消极的,东方是积极的。
Here is a snip of my data frame
请告诉我如何实现这一点!
【问题讨论】:
对于定义为df的数据框
# build a sample data frame with two columns, lat and long
df <- data.frame(Lat = c("1.2N", "1.2S", "35.5N", "33.4S"),
Long = c("113.8W", "113.5W", "43.2E", "55.4E"))
# use gsub with signature gsub(PATTERN, REPLACEMENT, X)
# where you use a regex for the pattern and replacement
# and X is your target.
df$Lat <- gsub("(\\d*\\.\\d*)N","\\1", df$Lat, perl = TRUE)
df$Lat <- gsub("(\\d*\\.\\d*)S","-\\1", df$Lat, perl = TRUE)
df$Long <- gsub("(\\d*\\.\\d*)W","\\1", df$Long, perl = TRUE)
df$Long <- gsub("(\\d*\\.\\d*)E","-\\1", df$Long, perl = TRUE)
所以现在剩下的唯一工作就是计算出正则表达式,这对 R 来说并没有什么特别之处,除了你将在其他任何地方用作 \w 的东西,在 R 中你需要变成 \\w 等.
所以,我们想要匹配数字,所以单个正则表达式数字是(在 R 中)\\d,所以我们想要捕获所有小数点前后的数字,这意味着
\\d*.\\d*
但是. 在正则表达式中是特殊的,所以让我们转义它
\\d*\\.\\d*
现在让我们想想N,我们想在替换中删除它,所以我们需要对数字进行分组,以便将它们保留在我们的匹配中。我们用括号来做这件事。所以,一组,这封信给了我们
(\\d*\\.\\d*)N
我们可以用\\1 替换我们的捕获组。所以我们的替换正则表达式很简单
\\1 which really means \\d*\\.\\d*
同样对于 S,我们在每个匹配项的前面添加一个-
-\\1
【讨论】:
df[,c("Lat", "Long")] <- lapply(df[,c("Lat", "Long")], function(x) sub("(.*)[NE]","\\1", sub("(.*)[SW]", "-\\1", x)))