解析R中URL列的矢量化方法

时间:2014-08-28 11:38:11

标签: r

我有一个2列数据框,包含user_id和他们进入网站的网址。我很想从URL解析一些关键数据。

来自parse_url pacakge的httr函数似乎在提取关键字段方面表现不错,但我对如何将其变为创建新数据框的高效过程感到困惑 - 我知道写'for循环'的'简单选项'不是可行的方法。

我尝试了sapply的基本方法,其中似乎是朝着正确方向迈出的一步,但它以基本形式进行的转换并不是我所期待的对

一个潜在的复杂因素是该函数将由&分隔的网址元素嵌套在名为Query的顶级变量中。我的简单手动示例如下所示:

library(httr)
x <- parse_url("http://www.thesite.com/en/landingpage1?currency=GBP&utm_term=bar&creative=15895258")
c(x$query$utm_term, x$query$creative)
[1] "bar"    "15895258"

我的原始数据框如下所示:

user_id | url
=======================================
50      | http://www.thesite.com/en/lpage1?currency=GBP&utm_term=bar&creative=15895258

51      | http://www.thebsite.com/en/lpage2?currency=GBP&utm_term=foo&creative=15895852

52      | http://www.thesite.com/en/lpage1?currency=USD&utm_term=foobar&creative=15895498

所需的输出如下所示:

user_id | utm_term  | creative
-----------------------------------
50      | bar       | 15895258
51      | foo       | 15895852
52      | foobar    | 15895498

任何帮助或想法表示赞赏! 雅各布

3 个答案:

答案 0 :(得分:2)

使用regex

  library(stringi)
  df[,2:3] <- setNames(as.data.frame(do.call(rbind,
          stri_extract_all_regex(df$url, "(?<=utm_term=|creative=)[A-Za-z0-9]+")),
                   stringsAsFactors=FALSE), c("utm_term", "creative"))
  df
   # user_id    url creative
  #1      50    bar 15895258
  #2      51    foo 15895852
  #3       2 foobar 15895498

或使用data.table

 library(data.table)#v1.9.5+
 setDT(df)[, c('url', 'creative') := tstrsplit(url, '^.*term=|&creative=',
              type.convert=TRUE)[-1]][]
 #   user_id    url creative
 #1:      50    bar 15895258
 #2:      51    foo 15895852
 #3:       2 foobar 15895498

数据

  df <- structure(list(user_id = c(50L, 51L, 2L), url = c("http://www.thesite.com/en/lpage1?currency=GBP&utm_term=bar&creative=15895258", 
 "http://www.thebsite.com/en/lpage2?currency=GBP&utm_term=foo&creative=15895852", 
 "http://www.thesite.com/en/lpage1?currency=USD&utm_term=foobar&creative=15895498"
 )), .Names = c("user_id", "url"), class = "data.frame", row.names = c(NA, 
 -3L))

答案 1 :(得分:0)

如果您的data.framedf

res <- sapply(df$url, function(u) {
    x <- parse_url(u)
    c(x$query$utm_term, x$query$creative)
})
res <- data.frame(user_id=df$user_id,
                  utm_term=res[1,],
                  creative=res[2,])
res
##   user_id utm_term creative
## 1      50      bar 15895258
## 2      51      foo 15895852
## 3      52   foobar 15895498

希望有所帮助

答案 2 :(得分:0)

在每一行上使用apply和running函数

df=data.frame(id=50:52,url=c("http://www.thesite.com/en/lpage1?currency=GBP&utm_term=bar&creative=15895258",
                             "http://www.thebsite.com/en/lpage2?currency=GBP&utm_term=foo&creative=15895852",
                             "http://www.thesite.com/en/lpage1?currency=USD&utm_term=foobar&creative=15895498"))

df2=as.data.frame(do.call(rbind,apply(df,1,function(x){      #row binding everything
  c(x["id"],parse_url(x["url"])$query[c("utm_term","creative")]) #adding id,utm_term and creative
  })))