Thank you so much!
________________________________ From: David Winsemius <dwinsem...@comcast.net> Cc: r-help r-help <r-help@r-project.org> Sent: Thu, 21 October, 2010 15:43:37 Subject: Re: [R] Changing sign on absolute numbers 0 problems With permission I am copying a private communication to the list. On Oct 21, 2010, at 9:20 AM, Sadz A wrote: > Hi, > > I think maybe I did not explain myself properly, I'll try again; > > I am trying to convert location data in DMS degrees to decimal degrees format. > > I have attached my data and below is the work I have done so far and notes >explaining what I have done. The problem is negative 0, the +/- sign indicates >direction so it is very important to have the right sign in front, but R takes >0 >and -0 as 0. > > #approach > #download 'gsubfn' from R CRAN. > > #please insert appropriate directory, the table is attached# > data<-read.table("vol by genous lat lon.txt",header=T) > names(data) > attach(data) > library(gsubfn) > > #the latitude data is in "MD_LATITUD" so to separate out the numbers and >convert to decimal degrees i used....... At this point I realized that my earlier assumption that -0 == 0 might not be as "obvious" as I had thought, at least when it applies to the leading degrees entry in a latitude, which I was not thinking about very clearly. > > latitude<-as.vector(MD_LATITUD) > x <- c(latitude) > Convert <- function(d, m, s, dd = as.numeric(d), mm = as.numeric(m), ss = >as.numeric(s)) sign(dd) * (abs(dd) + mm / 60 + ss / 3600) The problem as I saw it was that the as.numeric conversion of d to dd was throwing away the sign. test <- c("-0:00:53", "-0:01:10.", "-0:01:26.", "-0:01:38.", "-0:01:43", "-0:01:59.", "-0:03:50.", "-0:04:46", "-0:05:01.", "-0:05:16.", "3:41:33.0", "3:43:09.4", "3:44:26.3", "3:47:26.0", "3:48:19.3", "3:52:13.4", "3:57:10.2", "4:29:37.6", "5:01:28.4", "5:08:45.6" ) So I substituted an ifelse( grepl(d) -1,1) test for "-" from the unconverted degree entry: Convert <- function(d, m, s, dd = as.numeric(d), mm = as.numeric(m), ss = as.numeric(s)){ ifelse(grepl("-", d),-1,1) * (abs(dd) + mm / 60 + ss / 3600) } Lat<-strapply(test, "(.*):(.*):(.*)", Convert, simplify = TRUE) > Lat [1] -0.01472222 -0.01944444 -0.02388889 -0.02722222 -0.02861111 -0.03305556 -0.06388889 -0.07944444 [9] -0.08361111 -0.08777778 3.69250000 3.71927778 3.74063889 3.79055556 3.80536111 3.87038889 [17] 3.95283333 4.49377778 5.02455556 5.14600000 > Lat<-strapply(x, "(.*):(.*):(.*)", Convert, simplify = TRUE) > Lat > > #as you can see in Lat there are lots of 0's, which should not be there but > are >because 'sign(dd)' takes +ve when +ve, -ve when -ve and multiplies it by >'abs(dd)....' which is correct, BUT for 0 it assigns niether +ve or -ve, >giving >0 a 0, and anything times 0 is 0.......... > > #I modified the code to > > latitude<-as.vector(MD_LATITUD) > x <- c(latitude) > Convert <- function(d, m, s, dd = as.numeric(d), mm = as.numeric(m), ss = >as.numeric(s)) sign(ifelse(dd==0,sign(dd))) * (abs(dd) + mm / 60 + ss / 3600) > Lat<-strapply(x, "(.*):(.*):(.*)", Convert, simplify = TRUE) > Lat > > #so I now have the correct absolute decimal degrees in all cases and the >correct direction in all cases except where there should be a -0!, because >-0's >are ignored and assumed to be the same as +0 which is wrong because the + and >- >indicate direction. > > # Do you know of a way I can get R to separate out the sign from MD_LATITUD, > so >that I can change > # 'Convert <- function(d, m, s, dd = as.numeric(d), mm = as.numeric(m), ss = >as.numeric(s)) sign(dd) * (abs(dd) + mm / 60 + ss / 3600)' to something like > # 'Convert <- function(sign, d, m, s, dd = as.numeric(d), mm = as.numeric(m), >ss = as.numeric(s)) sign * (abs(dd) + mm / 60 + ss / 3600) #(this does not >work >but something similar, or a different approach may?) > > Any help will be appreciated. > Thank you > sadz > > > From: David Winsemius <dwinsem...@comcast.net> > To: David Winsemius <dwinsem...@comcast.net> > Sent: Wed, 20 October, 2010 20:45:39 > Subject: Re: [R] Changing sign on absolute numbers 0 problems > > > On Oct 20, 2010, at 3:19 PM, David Winsemius wrote: > > > > > On Oct 20, 2010, at 11:47 AM, Sadz A wrote: > > > >> Hi, > >> > >> I am trying to do some calculations turning DMS data to decimal degrees >using > >> the formula (D+(M/60)+(S/3600)), some of the D's involve -ve numbers, the > >> easiest way to do the calculation is to use absolute numbers then use the >'sign' > >> function in R to change the answer back to the correct -ve or +ve, > >> > >> for example, if; > >> D<--69 > >> M<-8 > >> S<-10 > >> then > >> decimal<-D+(M/60)+(S/3600) > >> -69+(8/60)+(10/3600) = this would equal -68.86389 (which is wrong, it >should > >> be -69.13611, so i used the following function) > >> > >> decimal<-(abs(D)+(M/60)+(S/3600)) > >> decimal.degs<-sign(D)*decimal > >> decimal.degs > >> -69.13611 > >> > >> because ((69+(8/60)+(10/3600)=69.13611) and then the -sign is put back in. > >> > >> This works fine untill D=0 > >> because then 'sign' does not give 0 a +ve sign it takes it as 0 and >multiplies > >> decimal by 0 to give 0. > >> example > >> D<-0 > >> decimal<-D+(M/60)+(S/3600) > >> decimal.degs<-sign(D)*decimal > >> decimal.degs > >> 0 > >> > >> Is there anyway to get around this?????????? > > > > I am not sure I understand the source of your distress. Why are you > > disturbed >that 0 returns 0? ?????? > > > >> and make D=0 a positive and not a 0 with sign or another function?????? > > > > You can always define your own function: > > > > nonneg <- function(x) { 0 + !sign(x) } > > > > > nonneg(0) > > [1] 1 > > Insufficient testing. Try instead: > > > nonneg <- function(x) { 0+(x >= 0 )} > > nonneg(c(-2,-1,0,1,2)) > [1] 0 0 1 1 1 > > > > > > > >> > >> Any help is appreciated > >> Thank you > >> sadz > >> > >> ps please email me if you need more info > > --David Winsemius, MD > > West Hartford, CT > > > > ______________________________________________ > > R-help@r-project.org mailing list > > https://stat.ethz.ch/mailman/listinfo/r-help > > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > > and provide commented, minimal, self-contained, reproducible code. > > David Winsemius, MD > West Hartford, CT > > > <vol by genous lat lon.txt> David Winsemius, MD West Hartford, CT [[alternative HTML version deleted]] ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.