2015-10-19 2 views
0

Я пытаюсь изменить значения в столбцах Широта и Долгота. Вместо Юга (по широте) я хочу сбросить S и сделать число отрицательным. Если это Северный, я просто хочу сбросить N. Я хотел бы сделать то же самое с долготой и отбросить буквы. Я хочу, чтобы Запад был отрицательным, а Восток был положительным.Условные изменения значений в столбце R

Here is a snip of my data frame

Пожалуйста, дайте мне знать, как я могу сделать это!

+0

Привет. Пожалуйста, прочитайте [this] (http://stackoverflow.com/q/5963269/640783), чтобы обеспечить лучший пример вашей проблемы и данных. –

ответ

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 где-нибудь еще , в R вам нужно превратиться в \\w и т. д.

Итак, мы хотим сопоставить цифры, поэтому одна цифра регулярного выражения (в R) \\d, поэтому мы хотим захватить все их до и после нашего десятичного знака, что означает

\\d*.\\d* 

но . особенный в регулярном выражении, так что давайте избежать его

\\d*\\.\\d* 

Теперь давайте думать о N, и мы хотим, чтобы удалить, что в замене, так что нам нужно сгруппировать цифры так что мы держим их в нашем матче. Мы делаем это с помощью круглых скобок. Так, одна группа и письмо дают нам

(\\d*\\.\\d*)N 

мы можем сослаться на захваченную группу в нашей замене с \\1. Таким образом, наша замена регулярное выражение просто

\\1 which really means \\d*\\.\\d* 

и аналогично для S, где мы добавим - к передней части каждого матча с

-\\1 
+0

Спасибо! Я пытался использовать gsub(), но я не мог правильно получить синтаксис. Есть ли способ, которым вы могли бы точно указать, что делает каждый аргумент? – jzurks

+1

Та же идея в одной команде 'df [, c (" Lat "," Long ")] <- lapply (df [, c (" Lat "," Long ")], function (x) sub (" (. *) [NE] "," \\ 1 ", sub (" (. *) [SW] "," - \\ 1 ", x))) ' –

Смежные вопросы