2012-11-19 66 views
3

創建表自從我開始,使用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和調換信息變換爲不同的列,示例如下:

用戶/來源/ utm_source

1/googleclick/ADX & ID56789

2/googleclick/ADW & ID56009

3/googleclick/ADWORDS & ID53389

因此,在本質我需要R鍵在整個數據幀搜索的值「 utm_source =「,一旦它找到了它們,我希望它將」utm_source =「值轉換爲列名,並將每個單獨行中的」=「後面的所有信息複製到該列中。我知道「grep」是一個函數,用於查找datafreme中的特定信息,例如數據< - total [grepl(「utm_source」,total $ Source),]。這會給我所有包含單詞「utm_source」的行,但我需要的是「utm_source」之後的信息。通常我的數據可以有多達500.000行。目前,我使用excel函數「文本到列」來實現此目的,我基本上將URL分成幾個小部分,並保留我需要的列,但這可能是一個非常混亂而漫長的過程。

有沒有辦法修改grepl函數來滿足我需要的標準?

+3

如果有人說某件事在R中是不可能的,那就不要懷疑它們。如果他們說在Excel中可能,運行! –

+0

:))))我知道,我知道Excel並不是真正的數據統計學家的軟件。 –

+0

Excel有其價值,但對於數據分析來說,R要強得多。 –

回答

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" 

然後找一個火鉗和粘在你所謂的顧問的眼睛。


編輯:

至於建議由保羅Hiemstra,你也可以直接使用正則表達式:

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

+1,但是基於正則表達式的解決方案可能更加健壯。 –

+0

@PaulHiemstra同意。回答編輯。 – Andrie

+0

有趣的是,有人會說R在R中是不可能的,但是在Excel中。我只知道其他方面的例子。 –

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" 
+0

嗨mplourde。你能解釋一下,當你嘗試它時,安德里的建議是如何工作的?在我的情況下,它沒有。你的工作直到do.call(rbind,all.substrings)。當我嘗試子集化(因爲我需要將它導出爲csv),它給了我一個字符矩陣。 –

+0

所以,爲了清楚起見,我所需的輸出是一個包含以下列的子集:Col1- userID,Col2-utm_source(並且在此列的每一行內部,每一行中的內容都應該放在URL中最初存在的內容之間=和&(ADW或ADX或ADWords)。我希望這是有道理的:) –

+0

@David顯然你的'data.frame'中的URL是'type'因子。他們需要成爲「人物」才能發揮作用。在我提供的例子中,你可以按照Andrie的建議在讀取數據時使用'stringsAsFactors = FALSE',或者用'as.character(d $ URL)'替換'd $ URL'。 –