2016-02-08 3 views
-1

мне нужно, эффективно анализировать одну из моей колонки dataframe (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 

Это ДФ имеет 100k строк, и я не хочу, чтобы петля/перебрать его, разобрать каждый 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, то второй до 5-го столбцов будет заполняться с соответствующими результатами от применения

unlist(strsplit(url,"/")) 

- принимать только первый, 2-й, 3-й и 4-й элементов из приведеннога вектор и положить его в первая, 2-й, 3-й и 4-й колонна в df.result и, наконец, ставящие spark.data.url.clean$classes в новых кадрах данных столбцов df.result$classificaiton

Извините за усложнение и дайте мне знать, если что-то нужно быть дополнительно очищено.

ответ

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 
Смежные вопросы