在数据框中搜索唯一值并使用它们创建表

时间:2012-11-19 15:00:07

标签: r search grep transpose

自从我开始使用R<不久前,我发现这个网站对于帮助我构建我的脚本非常有用。我再次遇到了一个挑战,我似乎无法在任何地方找到答案。这是我的问题:在我的数据中,我有一个列,每行包含一个不同的URL。在每个URL中都有我要提取的特定信息。目前我在excel中这样做,因为我被告知在R中不可能做到并且没有任何功能可以做到。

该URL看起来像这个示例格式,它将在“源”列中找到

http://www.googleclick.com?utm_source=ADX&ID56789

http://www.googleclick.com?utm_source=ADW&ID56009

http://www.googleclick.com?utm_source=ADWords&ID53389

对我来说重要的URL部分是“utm_source = ADX”位。我的数据看起来像这样:

用户/来源

1 / http://www.googleclick.com?utm_source=ADX&ID56789

2 / http://www.googleclick.com?utm_source=ADW&ID56009

3 / http://www.googleclick.com?utm_source=ADWords&ID53389

我需要做的是从URL捕获utm_source并将信息转换到不同的列,例如:

User / Source / utm_source

1 / googleclick / ADX& ID56789

2 / googleclick / ADW& ID56009

3 / googleclick / ADWords& ID53389

所以本质上我需要R在整个数据帧中搜索值“utm_source =”,一旦找到它们,我希望它将“utm_source =”值转换为列名并复制所有信息在每列单独一列的“=”之后出现。我知道“grep”是一个在datafreme中定位特定信息的函数,例如data< - total [grepl(“utm_source”,total $ Source),]。这将为我提供包含单词“utm_source”的所有行,但我需要的是“utm_source”之后的信息。通常我的数据可以有多达500.000行。目前我使用excel函数“text to columns”为此,我基本上将URL分成小位并保留我需要的列,但这可能是一个非常混乱和冗长的过程。

有没有办法修改grepl函数以满足我需要的标准?

2 个答案:

答案 0 :(得分:4)

没有什么是不可能的。

x <- read.csv(text="
User, Source
1, http://www.googleclick.com?utm_source=ADX&ID56789
2, http://www.googleclick.com?utm_source=ADW&ID56009
3, http://www.googleclick.com?utm_source=ADWords&ID53389
", header=TRUE, stringsAsFactors=FALSE)

首先,使用strsplit

strsplit(x$Source, split="\\?utm_source=")
[[1]]
[1] " http://www.googleclick.com" "ADX&ID56789"                

[[2]]
[1] " http://www.googleclick.com" "ADW&ID56009"                

[[3]]
[1] " http://www.googleclick.com" "ADWords&ID53389" 

然后找到一个炙手可热的扑克并坚持你所谓的顾问的眼睛。


编辑:

根据Paul Hiemstra的建议,您也可以直接使用正则表达式:

gsub(".*\\?utm_source=", "", x$Source)
[1] "ADX&ID56789"     "ADW&ID56009"     "ADWords&ID53389"

答案 1 :(得分:1)

@Andrie的答案就是诀窍。这是使用可能有用的regmatchesgregexpr的另一种方式。

d <- read.table(text="User URL
1 http://www.googleclick.com?utm_source=ADX&ID56789
2 http://www.googleclick.com?utm_source=ADW&ID56009
3 http://www.googleclick.com?utm_source=ADWords&ID53389", header=TRUE)

domain.pat <- '((?<=www.)([[:alnum:]_]+))'
source.pat <- '((?<=utm_source=)([[:alnum:]&]+))' # exclude the '&' here to only grab up to the '&'
all.matches <- gregexpr(paste(domain.pat, source.pat, sep='|'), d$URL, perl=TRUE)
all.substrings <- regmatches(d$URL, all.matches)
do.call(rbind, all.substrings)

#      [,1]          [,2]             
# [1,] "googleclick" "ADX&ID56789"    
# [2,] "googleclick" "ADW&ID56009"    
# [3,] "googleclick" "ADWords&ID53389"