R 将Lat/Long坐标更改为正小数和负小数

R 将Lat/Long坐标更改为正小数和负小数,r,dataframe,R,Dataframe,您好,我有一组数据,以“22.0N”、“2.0E”的格式保存纬度和经度坐标,我希望能够以数字方式处理这些数据。我是R新手,所以我想知道是否有人能帮我将数据列(fbdata$LATIONE(Deg))转换成更有用的内容。i、 e.南纬度和东经度为负数,没有任何字母,因此我可以将其从字符类更改为负数。 这是我提出的代码,显然不起作用(这就是为什么我在这里!) 任何帮助都会很好 您可以使用tidyr的separate()函数来完成此操作 首先,我们分成两列,将方向与度分开。我选择使用remove=FA

您好,我有一组数据,以“22.0N”、“2.0E”的格式保存纬度和经度坐标,我希望能够以数字方式处理这些数据。我是R新手,所以我想知道是否有人能帮我将数据列(fbdata$LATIONE(Deg))转换成更有用的内容。i、 e.南纬度和东经度为负数,没有任何字母,因此我可以将其从字符类更改为负数。 这是我提出的代码,显然不起作用(这就是为什么我在这里!)


任何帮助都会很好

您可以使用tidyr的
separate()
函数来完成此操作

首先,我们分成两列,将方向与度分开。我选择使用remove=FALSE保留旧列,以防您出于其他目的需要它
sep=-1
分割最后一个字符,即方向。一旦你拥有了自己的学位,你应该能够使用
as.numeric
来转换它

fbdata %>%
separate(col = Latitude..Deg., into = c('degree', 'direction'), sep = -1, remove = FALSE) %>%
mutate(degree = as.numeric(degree))
然后对于正/负方向,对于方向为南或东的情况,我们将度数列乘以-1以翻转符号。当方向不是这两个方向中的任何一个时,我们保持原样

从上述代码中删除以下内容:

%>% mutate(degree = case_when(direction %in% c('S', 'E') ~ degree*(-1), TRUE ~ degree))
或者只是使用
ifelse()
,我个人觉得这更容易阅读:

fbdata$degree <- ifelse(fbdata$direction %in% c('S', 'E'), fbdata$degree*(-1), fbdata$degree)

fbdata$degree谢谢Elle,但实际上我可以使用内置的R函数来完成,可能是额外的包造成了问题。
这是我的代码,用于分离列并以数字方式调整方向

fbdata$Lat_Degree <- sapply(strsplit(fbdata$Latitude..Deg.,"(?=[A-Z])", perl = TRUE),'[', 1)
fbdata$Lat_Direction <- sapply(strsplit(fbdata$Latitude..Deg.,"(?=[A-Z])", perl = TRUE),'[', 2)
fbdata$Lat_Degree = as.numeric(fbdata$Lat_Degree)
ifelse(fbdata$Lat_Direction == "S", fbdata$Lat_Degree * (-1), fbdata$Lat_Degree)

fbdata$Lat_Degree
separate
功能来自
tidyr
软件包,而不是
dplyr
。啊,感谢您的提醒。我总是把它们放在一起使用,所以它们在我脑子里不是很好地分开!谢谢Elle!不过,我在让它通过时遇到了一些麻烦。我什么时候会跑那些路线(注意,我调整了名称,因为我目前只处理纬度,我得到以下错误。
$Hi Tyler中的错误,有什么问题吗?你能告诉我哪一行给了你这个错误吗?如果你提供一个数据样本,这个问题将更容易回答。复制
dput(head(fbdata))的输出
命令,单击帖子下方的按钮,将输出粘贴到问题中。有关详细信息,请参阅。
fbdata$Lat_Degree <- sapply(strsplit(fbdata$Latitude..Deg.,"(?=[A-Z])", perl = TRUE),'[', 1)
fbdata$Lat_Direction <- sapply(strsplit(fbdata$Latitude..Deg.,"(?=[A-Z])", perl = TRUE),'[', 2)
fbdata$Lat_Degree = as.numeric(fbdata$Lat_Degree)
ifelse(fbdata$Lat_Direction == "S", fbdata$Lat_Degree * (-1), fbdata$Lat_Degree)