【问题标题】:Using regular expression in R to categorize data在 R 中使用正则表达式对数据进行分类
【发布时间】:2011-07-01 03:43:38
【问题描述】:

我有一个包含两列的文件,一列具有 HTTP 对象的内容类型,例如 text/html、application/rar 等,另一列具有字节大小。

Content Type                                     Size
video/x-flv                                       100
image/jpeg                                        150
text/html                                         160
application/octet-stream                          200  
application/x-shockwave-flash                     ...
text/plain
application/x-javascript
text/xml
text/css
text/html; charset=utf-8
application/x-javascript; charset=utf-8           ...

如您所见,同一内容类型有许多变体,例如application/x-javascriptapplication/x-javascript; charset=utf-8 等。所以,我想创建另一个列来更一般地对它们进行分类。所以,这两个就是web/javascript等等。

 Content Type                                      Size      Category
    video/x-flv                                       100       web/video
    image/jpeg                                        150       web/image
    text/html                                         160       web/html
    application/octet-stream                          200       web/binary
    application/x-shockwave-flash                     ...       web/flash
    text/plain                                                  web/plaintext
    application/x-javascript                                    web/javascript
    video/x-msvideo                                             web/video
    text/xml                                                    web/xml
    text/css                                                    web/css
    text/html; charset=utf-8                                    web/html
    video/quicktime                                             web/video
    application/x-javascript; charset=utf-8                     web/javascript

我将如何在 R 中完成此操作,并且我认为我需要为此使用某种正则表达式?

【问题讨论】:

  • 我不确定我是否正确理解了这一点...您想使用正则表达式创建第三列,其中包含...究竟是什么?能不能说的详细点?
  • 好吧,我将在内容类型字段中给出更一般的类别,例如在示例 video/x-flv、video/quicktime 等中,通过搜索都属于一个类别“web/video”列中的文本“视频”。同样,搜索“javascript”并将其放入第 3 列的“web/javascript”中。所以,我认为搜索这些关键字需要正则表达式。
  • 我只需要知道如何搜索和映射相关类别。

标签: regex r aggregate


【解决方案1】:

假设DF 是我们的数据框。定义一个正则表达式re 来匹配感兴趣的字符串,然后使用gsubfn 包中的strapply 来提取它们,并为每个字符串加上前缀"web/"。在strapply 语句中,我们将DF[[1]] 转换为字符,以防万一它是一个因子而不是字符向量。 NULL 条目不匹配,因此假设它们是 "web/binary" 。最后将所有出现的"plain" 扩展为"plaintext"

> library(gsubfn)
> re <- "(video|image|html|flash|plain|javascript|xml|css).*"
> short <- strapply(as.character(DF[[1]]), re, ~ paste("web", x, sep = "/"))
> DF$short <- sapply(short, function(x) if (is.null(x)) "web/binary" else x)
> DF$short <- sub("plain", "plaintext", DF$short)
> DF
                                   Content          short
1                              video/x-flv      web/video
2                               image/jpeg      web/image
3                                text/html       web/html
4                 application/octet-stream     web/binary
5            application/x-shockwave-flash      web/flash
6                               text/plain  web/plaintext
7                 application/x-javascript web/javascript
8                          video/x-msvideo      web/video
9                                 text/xml        web/xml
10                                text/css        web/css
11                text/html; charset=utf-8       web/html
12                         video/quicktime      web/video
13 application/x-javascript; charset=utf-8 web/javascript

http://gsubfn.googlecode.com 有更多关于gsubfn 包的信息。

【讨论】:

    【解决方案2】:

    有几种方法可以简化变量。在这里,我将使用stringr 包进行字符串操作函数:

    R> library(stringr)
    

    首先,将您的内容类型变量复制到一个新的字符变量中:

    R> d <- data.frame(type=c("video/x-flv", "image/jpeg","video/x-msvideo", "application/x-javascript; charset=utf-8", "application/x-javascript"))
    R> d$type2 <- as.character(d$type)
    

    这只是给你:

                                         type                                   type2
    1                             video/x-flv                             video/x-flv
    2                              image/jpeg                              image/jpeg
    3                         video/x-msvideo                         video/x-msvideo
    4 application/x-javascript; charset=utf-8 application/x-javascript; charset=utf-8
    5                application/x-javascript                application/x-javascript
    

    然后你可以处理你的新变量。您可以手动将某些类型值替换为另一个:

    R> d$type2[d$type2 == "video/x-flv"] <- "video"
    R> d
                                         type                                   type2
    1                             video/x-flv                                   video
    2                              image/jpeg                              image/jpeg
    3                         video/x-msvideo                         video/x-msvideo
    4 application/x-javascript; charset=utf-8 application/x-javascript; charset=utf-8
    5                application/x-javascript                application/x-javascript
    

    您可以使用正则表达式匹配来替换所有匹配的值,例如“视频”:

    R> d$type2[str_detect(d$type2, ".*video.*")] <- "video"
    R> d
                                         type                                   type2
    1                             video/x-flv                                   video
    2                              image/jpeg                              image/jpeg
    3                         video/x-msvideo                                   video
    4 application/x-javascript; charset=utf-8 application/x-javascript; charset=utf-8
    5                application/x-javascript                application/x-javascript
    

    或者您可以使用正则表达式替换来清除某些值。例如,通过删除“;”后面的所有内容在您的内容类型中:

    R> d$type2 <- str_replace(d$type2, ";.*$", "")
    R> d
                                         type                    type2
    1                             video/x-flv                    video
    2                              image/jpeg               image/jpeg
    3                         video/x-msvideo                    video
    4 application/x-javascript; charset=utf-8 application/x-javascript
    5                application/x-javascript application/x-javascript
    

    不过,请注意指令的顺序,因为您的结果很大程度上取决于它。

    【讨论】:

      【解决方案3】:

      如果您必须手工完成,您可以将您的因素分配到相应的类别中。在此示例中,我将字母表的前 13 个字母组合为“1”,将后半部分字母组合为“2”。

      > x <- as.factor(sample(letters, 100, replace = TRUE))
      > x
        [1] d n p n k l a x c n v p l o u e z m y x t r q b l n y s s m d u l l a d k
       [38] t a p x s g w i p l b s o t b s h h v c b j o p h f j m v d r m x o d l e
       [75] l f y l u e w f e e o s w s m v a z q l a t f z x s
      Levels: a b c d e f g h i j k l m n o p q r s t u v w x y z
      > levels(x)
       [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s"
      [20] "t" "u" "v" "w" "x" "y" "z"
      > levels(x) <- c(rep(1, 13), rep(2, 13))
      > x
        [1] 1 2 2 2 1 1 1 2 1 2 2 2 1 2 2 1 2 1 2 2 2 2 2 1 1 2 2 2 2 1 1 2 1 1 1 1 1
       [38] 2 1 2 2 2 1 2 1 2 1 1 2 2 2 1 2 1 1 2 1 1 1 2 2 1 1 1 1 2 1 2 1 2 2 1 1 1
       [75] 1 1 2 1 2 1 2 1 1 1 2 2 2 2 1 2 1 2 2 1 1 2 1 2 2 2
      Levels: 1 2
      > levels(x)
      [1] "1" "2"
      

      如果您的示例包含(仅)因素,即:

      "video/x-flv" "image/jpeg" "video/x-msvideo" "application/x-javascript; charset=utf-8"
      

      ...你可以像这样编写你的关卡:

      levels(obj) <- c("web/video", "web/image", "web/video", "web/javascript")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-08-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-20
        • 1970-01-01
        相关资源
        最近更新 更多