替换R中的特殊字符

时间:2016-06-05 07:35:53

标签: r string geolocation geospatial

我有一个数据文件,其地理坐标以度 - 分 - 秒表示,其结构如下:

        mLayout = (SlidingUpPanelLayout) findViewById(R.id.sliding_layout);
        mLayout.setDragView(findViewById(R.id.userInfoRoot));
        mLayout.setPanelSlideListener(new SlidingUpPanelLayout.PanelSlideListener() {
            @Override
            public void onPanelSlide(View panel, float slideOffset) {
                Log.i(TAG, "onPanelSlide, offset " + slideOffset);
            }

            @Override
            public void onPanelExpanded(View panel) {
                Log.i(TAG, "onPanelExpanded");
                mLayout.setPanelState(SlidingUpPanelLayout.PanelState.COLLAPSED);
            }

            @Override
            public void onPanelCollapsed(View panel) {
                Log.i(TAG, "onPanelCollapsed");

            }

            @Override
            public void onPanelAnchored(View panel) {
                Log.i(TAG, "onPanelAnchored");
            }

            @Override
            public void onPanelHidden(View panel) {
                Log.i(TAG, "onPanelHidden");
            }
        });

我可以通过以下方式将其读入R:

39°47′01″ N,100°26′45″ W

我需要将坐标转换为十进制度数。我正在使用替换将其转换为d <- read.csv("D:/locations.csv", encoding="UTF-8") head(d) Location Lat Long United States 39°47'01<U+2033> N 100°26'45<U+2033> W Denmark 55°40'13<U+2033> N 10°20'00<U+2033> E . . . 所需的32d14'23" N格式。我正在使用以下替换,这对于度和秒工作正常,但不适用于分钟部分:

sp::char2dms

我应该如何替换会议记录?我已经尝试在'。

之前使用转义序列

更新

根据评论中的要求,这是使用dput的数据样本:

d$Lat %>% sub("°", "d", .) %>% sub("′", "m", .) %>% sub("″","s",.)
[1] "39d47′01s N   "35d00′00s N" "55d40′13s N"

2 个答案:

答案 0 :(得分:2)

我们可以使用捕获组

在一个sub中执行此操作
sub("(\\d+).(\\d+).(\\d+).*(\\s+.)", "\\1d\\2m\\3s\\4", v1)
#[1] "54d42m08s N" "1d20m23s S"  "64d41m11s N" "39d47m01s N" "4d47m58s S" 
#[6] "9d44m08s S"  "39d47m01s N" "19d25m57s N" "2d23m33s N"  "8d01m48s N" 

其中&#39; v1&#39;是d$Lat

在这里,我们没有使用%>%,因为它不需要。

答案 1 :(得分:0)

使用您的示例,您可以尝试以下操作(d$Lat应该data.frame):

d %>% sub("°", "d", .) %>% sub("'", "m", .) %>% sub("<U\\+2033>","s",.)
 [1] "54d42m08s N" "1d20m23s S"  "64d41m11s N" "39d47m01s N" "4d47m58s S" 
 [6] "9d44m08s S"  "39d47m01s N" "19d25m57s N" "2d23m33s N"  "8d01m48s N" 

但我认为可能有一种更聪明的方法(没有*sub来在坐标系之间进行转换。)