2016-02-08 62 views
-1

我需要,高效,分析我的數據幀列的一個(URL字符串) 和調用一個函數(strsplit)解析它,例如:r使用上的數據幀列函數

url <- c("www.google.com/nir1/nir2/nir3/index.asp") 

unlist(strsplit(url,"/")) 

我的數據框架:spark.data.url.clean看起來是這樣的:

    classes    url 
[107,662,685,508,111,654,509] drudgereport.com/level1/level2/level3 

這DF有10萬行,我不想循環/迭代它,單獨解析每一個URL,並將結果寫入新數據幀。 什麼,我需要/想是創建一個新的5列數據幀:

df.result <- data.frame(fullurl = as.character(),baseurl=as.character(), firstlevel = as.character(), secondlevel=as.character(),thirdlevel=as.character(),classificaiton=as.character()) 

調用一個「應用」家庭功能在spark.data.url.clean$url 和結果寫入新的數據幀df.result使得第一列(fullurl)將與相關spark.data.url.clean$url被填充,第2至5列將與相關結果進行填充從應用

unlist(strsplit(url,"/")) 

- 從導致服用只有第一,第二,第三和第四個元素矢量並將其放入第一,第二,第三和第四列df.result終於把新數據幀列df.result$classificaiton

很抱歉的併發症spark.data.url.clean$classes,讓我知道如果有什麼需要進一步清除。

回答

1

沒有必要apply,據我看到它。

試試這個:

spark.data.url.clean <- data.frame(classes = c(107,662,685,508,111,654,509), 
    url = c("drudgereport.com/level1/level2/level3", "drudgeddddreport.com/levelfe1/lefvel2/leveel3", 
      "drudgeaasreport2.com/lefvel13/lffvel244/fel223", "otherurl.com/level1/second/level3", 
      "whateversite.com/level13/level244/level223", "esportsnow.com/first/level2/level3", 
      "reeport2.com/level13/level244/third"), stringsAsFactors = FALSE) 

df.result <- spark.data.url.clean 

names(df.result) <- c("classification", "fullurl") 

df.result[c("baseurl", "firstlevel", "secondlevel", "thirdlevel")] <- do.call(rbind, strsplit(df.result$fullurl, "/")) 
-1

簡單的解決方法是使用:

apply(row, 2, function(col) {}) 
+2

這不回答這個問題。 – Heroka

0

你可以考慮使用包splitstackshape做到這一點;我們可以使用它的cSplit-功能。將drop設置爲F可確保保留原始列。並非它返回data.table,而不是data.frame。使用

library(splitstackshape) 
output <- cSplit(dat,2,sep="/", drop=F) 

數據:

dat <- data.frame(classes="[107,662,685,508,111,654,509]", 
        url="drudgereport.com/level1/level2/level3") 
0

下面是與data.table一個選項,它應該是相當快的。如果您的數據是這樣的:

> df 
#      classes         url 
#1 [107,662,685,508,111,654,509] drudgereport.com/level1/level2/level3 

你可以做到以下幾點:

library(data.table) 
setDT(df) # convert to data.table 
cols <- c("baseurl", "firstlevel", "secondlevel", "thirdlevel") # define new column names 
df[, (cols) := tstrsplit(url, "/", fixed = TRUE)[1:4]] # assign new columns 

現在,數據是這樣的:

> df 
#       classes         url   baseurl firstlevel secondlevel thirdlevel 
#1: [107,662,685,508,111,654,509] drudgereport.com/level1/level2/level3 drudgereport.com  level1  level2  level3