列R

时间:2015-10-19 00:11:17

标签: r dataframe

我正在尝试更改“纬度”和“经度”列中的值。而不是南(在纬度),我想放弃S并使数字为负数。如果是北方,我只想放弃N. 我想用经度做同样的事情,然后放下字母。我希望西方是消极的,东方是积极的。

Here is a snip of my data frame

请告诉我如何才能做到这一点!

1 个答案:

答案 0 :(得分:2)

对于定义为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之外的东西,你需要变成{ {1}}等等。

所以,我们想要匹配数字,所以一个正则表达式数字是(在R中)\\w,所以我们想要在我们的小数之前和之后捕获所有这些数字,这意味着

\\d

\\d*.\\d* 在正则表达式中很特殊,所以让我们将其转义为

.

现在让我们想一想\\d*\\.\\d* ,我们想要在替换中删除它,因此我们需要对数字进行分组,以便我们将它们保留在匹配中。我们用括号做这个。所以,一组和这封信给了我们

N

我们可以在替换(\\d*\\.\\d*)N 时引用捕获的组。所以我们的替换正则表达式就是

\\1

并且类似于S,我们在

的每个匹配的前面添加\\1 which really means \\d*\\.\\d*
-
相关问题