我有一个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
任何帮助或想法表示赞赏! 雅各布
答案 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.frame
是df
:
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
})))