R在数据框列上应用函数

时间:2016-02-08 13:53:03

标签: r dataframe apply

我需要有效地解析我的一个dataframe列(一个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行,我不想循环/遍历它,分别解析每个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的第一,第二,第三和第四列中,最后将spark.data.url.clean$classes放入新数据框列df.result$classificaiton

对于复杂功能感到抱歉,如果有任何需要进一步清除,请告诉我。

4 个答案:

答案 0 :(得分: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 :(得分: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")

答案 2 :(得分: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

答案 3 :(得分:-1)

简单的解决方案是使用:

WebSocket connection to 'ws://78.46.244.23/ws' failed: Invalid frame header