选择以R中的模式开头的行

时间:2018-12-04 22:18:03

标签: r design-patterns

我正在使用R数据库,该数据库有3列,分别名为index,NAICS和HS2。数据库的头看起来像这样:

> head(base_sec)
        Index  NAICS    HS2
1   0.4074128   1111 010110
2   0.2858026  11111 010190
3   0.1103720  11112 010210
4  -0.8084129 111120 010290
5   0.5376827 111130 010310
6   0.6021241  11114 010391

好吧,我想选择NAICS列满足给定条件的行。更具体地说,我想选择NAICS以以下任何值开头的行:

  list=c("111","112", "113","114",
          "115", "211", "212", "213",
         "3111", "3112", "3113", "3114",
         "3115", "3116","3117", "3118",
          "3119", "321")

您知道如何解决此问题吗?任何想法表示赞赏。

谢谢!

2 个答案:

答案 0 :(得分:0)

尝试一下:

out = x[substr(x$NAICS, 0, 3) %in% list | substr(x$NAICS, 0, 4) %in% list,]

希望有帮助。

答案 1 :(得分:0)

正则表达式在这里起作用。最终,我们想要这样的东西:

grepl("^(11112|11113|11114)", x$NAICS)

我们对三个字符串 starting NAICS标识符感兴趣。 (为简洁起见,我在这里将其缩短。

您的数据,例如被截断了一点:

x <- read.table(header=TRUE, text="
        Index  NAICS    HS2
1   0.4074128   1111 010110
2   0.2858026  11111 010190
3   0.1103720  11112 010210
4  -0.8084129 111120 010290
5   0.5376827 111130 010310
6   0.6021241  11114 010391")

l <- c("11112", "11113", "11114")

要以编程方式做到这一点:

paste0("^(", paste(l, collapse="|"), ")")
# [1] "^(11112|11113|11114)"

所以我们可以这样做:

grepl(paste0("^(", paste(l, collapse="|"), ")"), x$NAICS)
# [1] FALSE FALSE  TRUE  TRUE  TRUE  TRUE

最终

x[grepl(paste0("^(", paste(l, collapse="|"), ")"), x$NAICS),]
#        Index  NAICS   HS2
# 3  0.1103720  11112 10210
# 4 -0.8084129 111120 10290
# 5  0.5376827 111130 10310
# 6  0.6021241  11114 10391