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
我需要高效地解析我的数据框列之一(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