R在数据框列上应用函数

R apply function on data frame column

我需要高效地解析我的数据框列之一(url 字符串) 并调用一个函数(strsplit)来解析它,例如:

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 有 100k 行,我不想 loop/iterate 覆盖它,分别解析每个 url 并将结果写入新的数据框。 我所做的 need/want 是创建一个新的 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 调用 "apply" 系列函数之一 并将结果写入新数据框 df.result,这样第一列 (fullurl) 将填充相关的 spark.data.url.clean$url,第二至第五列将填充相关的应用

的结果
unlist(strsplit(url,"/"))

- 从结果向量中取出第一个、第二个、第三个和第四个元素,并将其放入 df.result 的第一、第二、第三和第四列,最后将 spark.data.url.clean$classes在新的数据框列中 df.result$classificaiton

很抱歉造成并发症,如果有任何需要进一步清理的地方,请告诉我。

简单的解决方案是使用:

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

你可以考虑使用包 splitstackshape 来做这个;我们可以使用它的 cSplit 功能。将 drop 设置为 F 可确保保留原始列。不是说它returns一个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")

据我所知,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, "/"))

这里有一个带有 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