# 知识来源于网络,仅供交流使用,如有侵权请及时联系予以删除
library(stringr)
str_extract_all() # 字符提取,按照指定规则
x<-"abacdef123456789g"
str_extract_all(x,"[adef0-9]{2,5}")
# 按照给定的[字符]提取出来,且提取出的各个字符串,最少2个字符,最多5个字符
#按照给定字符切割,选择性保留切割结果,将结果另外为变量
# data.table操作,tstrsplit {data.table}
ss<-as.data.table(train$category_name) %>% head(10)
ss[, c("x", "y") := tstrsplit(ss$V1, split = "/", keep = c(1,2))] %>% head(10)
# data.frame操作,
方法1:separate {tidyr}
ss<-data.frame(V1=c(train$category_name)) %>% head(10)
ss<-separate(ss,V1,into=c("x","y"),sep="/") %>% head(10)
#%% 这里,如何选择性保留c(1,3)为c("x","y")
方法2:str_split {stringr}
splitVar = str_split(all$category_name, "/")
cat2 = sapply(splitVar,'[',2)
cat3 = sapply(splitVar,'[',3)
all['cat2'] = cat2
all['cat3'] = cat3
library(dplyr)
# Mutate() 增加列,对已有列进行数据运算并添加为新列
mutate(hflights_df,gain = ArrDelay - DepDelay, speed = Distance / AirTime * 60)
作用与 plyr::mutate() 相同, 与 base::transform() 相似, 优势在于可以在同一语句中对刚增加的列进行操作:
apply(item_cat,MARGIN=2, function(x) length(unique(x))) # 行列处理,这是对各列求非重复项个数
# MARGIN=1表示对行进行处理,如果为2,则表示对列进行处理
colSums(x,na.rm = FALSE,dims = 1)
rowSums(x,na.rm = FALSE,dims = 1)
colMeans(x,na.rm = FALSE,dims = 1)
rowMeans(x,na.rm = FALSE,dims = 1)
x <- sample(1:10, 1e5, rep = TRUE)
length(unique(x)) # 方法1:求非重复项的个数
library(dplyr)
n_distinct(x) # 方法2:求非重复项的个数
apply(x,2,function(x) length(unique(x))) # 求取x的各列非重复项个数
x = reorder(as.factor(shop_id), total_sales)
#reorder是一个通用函数。该"default"方法将其第一个参数作为分类变量处理,并根据第二个变量(通常是数字)的值对其级别进行重新排序。
# 分组摘要,summarise()
library(dplyr)
x<-data.frame(id=1:6,name=c("wang","wang","li","chen","zhao","song"),
shuxue=c(89,85,68,79,96,53),
yuwen=c(77,68,86,87,92,63))
summarise(x,sum(shuxue)) # 等价于 sum(x$shuxue)
summarise(group_by(x,name),sum(shuxue)) # 根据name分组求和shuxue
summarise(group_by(x,name),sum(shuxue,yuwen)) # 根据name分组求和shuxue+yuwen
arrange(summarise(group_by(x,name),qiuhe=sum(shuxue,yuwen)),desc(qiuhe)) # 将分组求和的结果按照新增列qiuhe降序排列
# 也可以先另存为数据框,然后用order进行排序输出
library(data.table)
# 文件读取,适用文件类型,目前tsv\csv
fread(file,sep="",nrows=,header=,stringsAsFactors=,skip=,select=,blank.lines.skip=,data.table=,nThread=)
# sep="",列之间的分隔符
# header=T,第一数据行是否包含列名
# nrows= ,确定读取的最大行数,如果设置为0,则返回列名
# stringsAsFactors=T,是否将所有字符转换为因子
# select= ,保留列名称或数字的向量,放下其余部分。
# data.table=T,返回的是data.table还是data.frame
# nThread=,要使用的线程数。试着看看什么对您硬件上的数据最有效。
# showProgress = FALSE, TRUE如果ETA大于3秒,则在控制台上显示进度。
# 对各列稀有数据进行处理【判断、提取、或者处理】 ### Clean variables with too many categories for(i in 1:ncol(train)){ if(!is.numeric(train[,i])){ # 确定非数值数据 freq = data.frame(table(train[,i])) #获得字符串数据频数表 freq = freq[order(freq$Freq, decreasing = TRUE),] # 对频数表进行降序排序 train[,i] = as.character(match(train[,i], freq$Var1[1:30])) #保留适当频数的字符串,频数低的则返回NA # 或者可以: train[,i] = as.character(match(train[,i], freq$Var1[which(freq$Freq>10)])) train[is.na(train[,i]),i] = "rareValue" train[,i] = as.factor(train[,i]) } }