字符串根据R中的字符长度排列

时间:2017-09-28 01:31:05

标签: r string

我的数据框如下DT。

YEAR  STATE LEGAL         char
1998  24    L00161N11W2     11
1998  24    L00161N11W11    12
1998  24    L00163N9W6      10
1998  24    L00363N9W6      10

有人可以建议我分割LEGAL列的有效方法,并按照“输出”中的说明进行排列吗?我计算了“char”列,它显示了LEGAL列字符串中的字符长度。

我需要建立一个方法来根据字符的长度排列SEC,TOWN和RANGE列。

Output:
    YEAR  STATE LEGAL         char   SEC  TOWN  RANGE
    1998  24    L00161N11W2     11   2    61N   11W
    1998  24    L00161N11W11    12   11   61N   11W
    1998  24    L00163N9W6      10   6    63N   9W

感谢任何帮助。

提前致谢。

3 个答案:

答案 0 :(得分:2)

一个基本的R解决方案就是使用gsub。在下面的代码片段中,我尝试使用最大程度灵活的正则表达式模式。例如,为了提取SEC列,我使用的逻辑表示匹配所有内容直到最后一个非数字字符。然后,捕获并提取后面的数字。此解决方案应该对您的合法字符串相对健壮。

df <- data.frame(YEAR=c(1998, 1998, 1998),
                 STATE=c(24, 24, 24),
                 LEGAL=c("L00161N11W2", "L00161N11W11", "L00163N9W6"),
                 char=c(11, 12, 10))

df$SEC   <- gsub(".*[^0-9]([0-9]+)", "\\1", df$LEGAL)
df$TOWN  <- gsub("L[0-9]{3}([0-9]+[^0-9]+).*", "\\1", df$LEGAL)
df$RANGE <- gsub(".*?([0-9]+[^0-9]+)[0-9]+$", "\\1", df$LEGAL)
df

<强>输出:

  YEAR STATE        LEGAL char SEC TOWN RANGE
1 1998    24  L00161N11W2   11   2  61N   11W
2 1998    24 L00161N11W11   12  11  61N   11W
3 1998    24   L00163N9W6   10   6  63N    9W

在这里演示:

Rextester

答案 1 :(得分:1)

您可以使用extract包中的tidyr

library(tidyverse)

df <- read_table("YEAR  STATE LEGAL         char
1998  24    L00161N11W2     11
1998  24    L00161N11W11    12
1998  24    L00163N9W6      10") 

df %>% extract(LEGAL, c("TOWN", "RANGE", "SEC"), "L001(\\d+\\D)(\\d+\\D)(\\d+)", remove = FALSE)
#> # A tibble: 3 x 7
#>    YEAR STATE        LEGAL  TOWN RANGE   SEC  char
#> * <int> <int>        <chr> <chr> <chr> <chr> <int>
#> 1  1998    24  L00161N11W2   61N   11W     2    11
#> 2  1998    24 L00161N11W11   61N   11W    11    12
#> 3  1998    24   L00163N9W6   63N    9W     6    10

答案 2 :(得分:1)

在最新版本的R中使用strcapture,这实际上反映了tidyr::extract解决方案:

cbind(df, 
strcapture(
  "L\\d{3}(\\d+?\\D+?)(\\d+?\\D+?)(\\d+)", 
  as.character(df$LEGAL),
  proto=data.frame(TOWN=character(), RANGE=character(), SEC=character())
))

#  YEAR STATE        LEGAL char TOWN RANGE SEC
#1 1998    24  L00161N11W2   11  61N   11W   2
#2 1998    24 L00161N11W11   12  61N   11W  11
#3 1998    24   L00163N9W6   10  63N    9W   6