[转] R 函数

# 知识来源于网络,仅供交流使用,如有侵权请及时联系予以删除

 
  
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])
  }
}



你可能感兴趣的:(R,学习)