我的数据框如下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
感谢任何帮助。
提前致谢。
答案 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
在这里演示:
答案 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