我需要有效地解析我的一个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
对于复杂功能感到抱歉,如果有任何需要进一步清除,请告诉我。
答案 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