Task views 比如我想做生存分析 但是我不知道生存分析哪些包可以做,这时我就可以在这里面找

向下拉可以看到有很多包,可以看到有的包后面带有core字样,这种为核心包

展示这个包的函数的用法及

  • 19:38 Rstudio网站的包
  • packages-install:可以安装cran上的包或者已经下载好的以.tgz和.tar.gz的包
  • install dependencies 是否安装依赖包,如果不勾选,一些包的功能就无法实现
  • help上的帮助问答和在cran官网上看到的包的帮助文档是一样的
  • appearance
  • packages:镜像问题 r语言在中国也是有镜像的,因此不需要登录到美国去,可以增加下包的速度
  • code:点击saving:改变默认字符编码格式,改成UTF-8,为了方便我们以后读入含有中文的数据集,防止出现乱码
  • 改变四个框的排版问题
  • my_fac2<-factor(LETTERS[1:5],labels = letters[1:5])
    my_fac3<-factor(1:5,labels = letters[1:5])
    my_fac4<-gl(n=2,k=5,labels = c('control','treatment'))
    my_fac5<-gl(n=2,k=1,length=8,labels = c('control','treatment'))
    
    temp_string<-c('A','B','AB','0')
    my_fac6<-as.factor(temp_string) #把temp_string变成因子
    my_fac6
    as.character(my_fac6)#互相转换
    
    nlevels(my_fac6)#可以查看有几个水平,通常结合as.factor使用
    [1] 4
    leves(my_fac6)
    [1]'A','B','AB','0'
    

    16:20 reference:得到的结果都要同reference来进行比较,就需要生成一个哑变量,就是这个reference

  • my_fac7<-relevel(my_fac6,ref='b')
    my_fac7
    [1]A B AB 0
    Levels:B A AB 0 #这里的levels就是讲B设置为了reference,也就是哑变量,出现在第一位
    my_fac6
    [1]A B AB 0 #未设置前默认A第一位是这个哑变量
    Levels:A B AB 0
    #有一个扩展包DescTools #的reorder函数
    x<-c('p','10mg','20mg','50mg')
    my_order_fac<-factor(x,ordered=T)
    my_order_fac
    [1] p 10mg 20mg 50mg
    levels:10mg<20mg<50mg<p
    library(DescTools)
    my_order_fac2<-reorder.factor(my_order_fac,new.order = x)
    [1] p 10mg 20mg 50mg
    levels:p<10mg<20mg<50mg
    

    8:20 再建一个比较复杂的list,list可以包含list

  • my_list3 <- list(1:10,letters[1:5],list=(11:14,LETTERS[1:5]))
    #找到my_list3里的大写A
    > my_list3<-list(1:10,letters[1:5],list(11:14,LETTERS[1:5]))
    > my_list3
    [[1]]
     [1]  1  2  3  4  5  6  7  8  9 10
    [[2]]
    [1] "a" "b" "c" "d" "e"
    [[3]]
    [[3]][[1]]
    [1] 11 12 13 14
    [[3]][[2]]
    [1] "A" "B" "C" "D" "E"
    > my_list3[[3]][[2]][1] #两个[[]]可以取到下一层,一个[]还是list,往下取就是matrix
    [1] "A"
    
  • 是一个线性代数的一个概念

  • my_matrix<-matrix(data=1:6,nrow=2,brow=TRUE)#brow默认是false,就是默认是按列排列的
    my_matrix2<-matrix(data=1:10,nrow=5)
    > my_matrix3
         [,1] [,2] [,3] [,4]
    [1,]    2    2    2    2
    [2,]    2    2    2    2
    [3,]    2    2    2    2
    > my_matrix4<-matrix(data = letters[1:3], nrow = 2,ncol = 4)
    Warning message:
    In matrix(data = letters[1:3], nrow = 2, ncol = 4) :
      数据长度[3]不是矩阵行数[2]的整倍
    > my_matrix4
         [,1] [,2] [,3] [,4]
    [1,] "a"  "c"  "b"  "a" 
    [2,] "b"  "a"  "c"  "b" 
    > my_matrix5<-matrix(data = 1:12,nrow = 3,ncol = 4,dimnames = list(c('a','b','c'),c('v1','v2','v3','v4')))
    > my_matrix5
      v1 v2 v3 v4
    a  1  4  7 10
    b  2  5  8 11
    c  3  6  9 12
    

    20:50除了列表外,向量、矩阵李敏所要求的数值型类型必须是相同的,即使原本传入的是数值型,matrix也会把数值型转变成字符型

  • > my_matrix6<-matrix(c(1:5,letters[1:5]),nrow = 2)
    > my_matrix6
         [,1] [,2] [,3] [,4] [,5]
    [1,] "1"  "3"  "5"  "b"  "d" 
    [2,] "2"  "4"  "a"  "c"  "e" 
    [2,]   10   12   14   16
    > my_array2<-  array(1:16,dim=c(4,2,2),dimnames=list(c(LETTERS[1:4]),c('col1','col2'),c('first','second')))  ##第二个数组示例,包括给数组命名
    > my_array2
    , , first
      col1 col2
    A    1    5
    B    2    6
    C    3    7
    D    4    8
    , , second
      col1 col2
    A    9   13
    B   10   14
    C   11   15
    D   12   16
    
  • 生成数据框

  • > my_df<-data.frame(name=c('TOM','ANDY','MARRY'),age=c(24,25,26),hegight=c(178,156,176))
    > my_df
       name age hegight
    1   TOM  24     178
    2  ANDY  25     156
    3 MARRY  26     176
    
  • nrow、ncol

  • 18:20介绍iris数据集

  • 8.数据框

    00:50注意变量名

  • 当某一列长度不一样,会报错
  • str 查看结构
  • stringsAsFactors = FALSE
  • 08:40数据操作

  • my_df$four <-letters[1:5,1:5]#新增
    my_df2<-edit(my_df)#弹出后,修改某一个数值,必须赋值一个新变量
    fix(my_df)#永久改,不需要赋值一个新的变量
    
  • 16:40 head tail

  • 18:30 describe(iris)用来查看数据框里更多内容:mean

  • 21:55names查看变量名names(iris)<-c('a','b','c','d','e')

  • 23:50把变量名改成中文,可以帮助改变量名,解决中文乱码

  • 需要增加一行代码

  • Sys.setlocale(catrgory = 'LC_CTYPE',locale='zh_CN.UTF-8')#mac系统
    Sys.setlocale(locale='chinese') #windows可以改
     [1] FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE  TRUE FALSE
     [1] 37 14 39 46 94 27 35 42 99 38
     [1] 89  1 56 57 70 86 63 44 72 69
    
  • ==append==但是把z附一个初值
  • > ####append
    > set.seed(2017) #结合了for循环,就会变成向量化操作
    > x<-sample(10:100,10)
    > y<-sample(1:100,10)
    > z<-NULL
    > for(i in 1:10){
    +   if(x[i] > y[i]){
    +     z= append(z,x[i])  #append追究添加到z的结果里,先进行一个 if(x[i]>y[i]的判断
    +   }
    [1] 14 94 99
     [1] 37 14 39 46 94 27 35 42 99 38
     [1] 89  1 56 57 70 86 63 44 72 69
    (3)values<-c(sqrt(1:100))
    my_fun3<-function(x,...){ #不知道summary里有什么参数因此两个...相互呼应,完全一致的
      print(x)
      summary(...)
    my_fun3('here is the summary for values:',values,digits=2)
    (4)addemup<-function(x,...){
      args<-list(...)
      for(a in args) x<-x+a
    addemup(1,2,3,4,5)
    (5)normalize<-function(x,m=mean(x,...),s=sd(x,...),...){
      (x-m)/s
    normalize(x=1:100)                      
    

    22:00reshape2进行长宽型数据转换

  • 判断是长形数据还是宽型数据,若是宽型数据,我们就用melt函数把它融化成长形数据,其中id.vars=...,这个...如果是长形数据,那么这一列就不需要融化,就用id.vars给标识出来就可以
  • #melt()融化函数 参数:id.vars= 就是标示出不融化的
    #dcast()汇总函数 参数:
    #(1)formula= Species~variable formula就是写一个公式,标识变量写在左边,想要操作的变量写在右边,
    #(2)fun.aggregate 汇总函数 
    #(3)value.var 对哪个变量进行汇总
    

    26:00复杂一点的数据

  • 下面这个后5列都是长形数据,是一个不同水平堆栈在一起的一个结构,只有前两列是纯粹数据。因此不需要melt来融化了,直接可以用dcast()函数
  • tips #上面的图片来自tips数据
    dcast(data=tips,formula = sex~. , fun.aggregate = mean, value.var = tip)#.是目前仅对sex这一个分类变量,用.来进行站位
    dcast(dcast(data=tips,formula = sex~somker , fun.aggregate = mean, value.var = tip))
    

    14.变量的因子化

  • 变量的因子化:患者年龄,不能按照连续性变量,但可以变成分类变量

  • 1.公式法

    age<-sample(20:80,20)
     [1] 59 41 68 27 26 23 47 58 44 75 72 38 77 24 56 48 74 66 54 70
    age1<-1+(age>30)+(age>=40)+(age>=50)
    age2<-1*(age<30)+2*(age>=30&age<40)+3*(age>=40&age<50)+4*(age>50)
    
  • 2.cut()

  • age3<-cut(age,breaks = 4,labels = 'young','middle','m-old','old'),include.lowest = TRUE, right =TRUE)
    > age4<-cut(age,breaks = seq(20,80,length=4),labels = 'young','middle','m-old','old')
    Error in cut.default(age, breaks = seq(20, 80, length = 4), labels = "young",  : 
      'breaks'和'labels'的长度不一样
    
  • 小插播seq,加length和不加length的区别
  • > seq(20,80,4)
     [1] 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80
    > seq(20,80,length=4)
     [1] 20 40 60 80
    
  • 3.ifelse()

  • ifelse(age>35,'old','young')
    ifelse(age>60,ifelse(age<30,'young','old',))
    > ifelse(age>60,'old',ifelse(age<30,'young','middle'))
     [1] "middle" "middle" "old"    "young"  "young"  "young"  "middle" "middle" "middle" "old"    "old"   
    [12] "middle" "old"    "young"  "middle" "middle" "old"    "old"    "middle" "old"   
    
  • 4.car()扩展包

  • recode(var=age,recodes="20:29 =1;30:39=2;40:49=3;50:hio=4")
    

    15.apply函数家族

  • 00:44数据汇总

  • 3:00apply+lapply

  • mat<-matrix(1:24,nrow =4,ncol= 6)
    apply(mat,1,sum)
    apply(iris[,1:4],2,mean)
    lapply(X = c(1:5),FUN = log)#返回的是list #遍历
    lapply(iris[,1:3],function(x)lm_x~iris$Petal.Width,data=iris[,1:3])
    
  • 07:40sapply 返回的是向量、矩阵、数据框

  • sapply(1:5,log)
    sapply(1:5,function(x)x+3)
    
  • 09:26tapply 只适用于数据框,是根据分类变量将一个数值型变量进行切分,在进行数据汇总

  • tapply(X=iris$Sepal.Length,INDEX = iris$Species,FUN = mean)
    

    11:40mapply

    myfun<-function(x,y){
      if(x>4)return(y)
      else return(x+y)
    myfun(1:5,2:6)
    mappply(myfun,1:5,2:6)
    

    16.数据汇总函数

  • 1:30 Ave

  • 3:00 by

  • 5:50aggrate 根据数据框原本的变量生成新的变量

  • view(mtcars)
    

    21:00dlply,lapply输出都是list,在做回归分析时用的多

    ​ 比如对iris数据集中的两个变量进行回归

    my_model<-function(x)lm(Sepal.length~Sepal.Width,data =x)
    dlply(iris,~Species,my_model)
    

    ==上面不太懂==

  • 23:50 each()、colwise()、numcolwise()对数据集进行批量操作
  • 00:40filter

    sub1<-filter(tips,tis$smoker=='No',tips$day=='Sun')#filter只针对数据框的行进行筛选
    sub2<-slice(tips,1:5)#针对行
    sub3<-select(tips,tip,sex,smoker)
    sub4<-select(tips,2:5)
    
  • Arrange()

  • nex_tips <- arrange(tips,desc(total_bill),tip)
    head(nes_tips)
    new_tips<-rename(tips,bill = total_bill,tipp = tip)
    distinct(tips,day)#返回因子水平函数
    
  • mutate()

  • mutate(tips,rate=tip/total,new_rate=rate*100)#new_rate和rate同步运行
    #transform这种情况就会报错,运行rate,可直接new_rate
    transform(tips,rate=tip/total,new_rate=rate*100)
    
  • sample_n

  • sample_n(iris,size=10)#随机抽取10行,
    sample_frac(iris,0.1)#随机抽取10%的行数,数据有150行,抽取15行
    
  • group_by,与summarise结合使用

  • group = group_by(tips,smoker)#把数据框中根据分类变量进行分组,然后进行汇总操作
    summarise(group,count = n(),mean_tips = mean(tip),sd_bill=sd(total_bill))#n用来计数
    
  • %>%管道符

  • result<-tips %in% group_by(smoker,sex) %in% summarise(group,count = n(),mean_tips = mean(tip),sd_bill=sd(total_bill))
    
  • 20:20join家族

  • df_a<-data.frame(x=c('a','b','c','a','c','b','c'),y=1:7)
    df_b<-data.frame(x=c('a','b','c'),z=10:12)
    inner_join(df_a,df_b,by='x')
    semi_join(df_a,df_b,by='x')
    anti_join(df_a,df_b,by='x')
    left_join(df_a,df_b,by='x')
    right_join(df_a,df_b,by='x')
    

    19.data.table

  • data.table 变量长度不一样时,长度短的变量会自动重复

  • dt<-dta.table(v1=c(1,2),v2=LETTERS[1:3],v3=round(rnorm(12,2,2)),v4=sample(1:20,12))#rnorm 生成均值为2标准差为2的服从标准正态分布
    dt[3:6,]
    dt[v2=='B']同df[v2=='B',]相同
    dt[v2 %in% c('A','B')]
    dt[,list(1,2)]
    dt[,list(sum_v4=sum(4),mean_v4=mean(v4))]
    dt[,list(v5=v4+1,v6=v3-1)]
    dt[,{print(v2);plot(1:12,v3,col='red')}] #;的作用就是分行 
    dt[,list(sum_v3=sum(v3),mean_v4=mean(v4),by=v2)]
    dt[,list(sum_v3=sum(v3),mean_v4=mean(v4),by=.(v1,v2)]
    dt[,list(sum_v3=sum(v3),mean_v4=mean(v4),by=list(v1,v2)]         
    dt[1:8,list(sum_v3=sum(v3),mean_v4=mean(v4),by=v2)]
    #N频数汇总
    dt[,.N,by=list(v1,v2)]
    dt[,v5 : v4+1]
    dt[,c('v5','v6'):= list(v3+1,v4-1]
    
  • Set key()设置关键变量

  • attach(iris)#如果不知道Species在attach里面,就可以先执行attach
    Species
    detach(iris)
    setkey(df,v2)#setkey设置让r知道现在要对df的v2进行搜索了
    dt[c('A','C')]
    dt[v2 %in% c('a','c')]
    

    nomatch

    dt[c('A','D'),nomatch=0] #没有D就不显示出来
    
  • by = .EACHI

  • %>% 串联操作

  • dt[,.(v4_sum = sum(v4)),by = v2][v4_sum>40]
    

    20.缺失值的识别与处理(1)

    X<-C(1,2.3,NA,NA,4)
    mean(x,na.rm=TRUE)
    sum(x,na.rm=TRUE)
    #对确实值求个数
    sum(is.na(x))
    #去掉na
    x[!is.na(x)]
    
    iris_na<-iris
    for(i in 1:4){
      iris_na[sample(1:nrow(iris),5),i]==NA
    sapply(iris_na[,1:4],function(x)which(is.na(x)))
    sapply(iris_na[,1:4],function(x)sum(is.na(x)))
    
  • psych包

  • library(psych)
    describe(iris_na)#由于前面我们设置了5个确实值,所以现在返回的是145行,把有na值的行直接去掉了
    sapply(iris_na[,1:4],function(x)(sum(is.na(x))/nrow(iris_na)))
    
  • 09:30回顾分析里有确实值

  • lm(Sepal.Length~Width,data = iris_na, na.action = na.omit)
    mean_value<-sapply(iris_na[,1:4],mean,na.rm =TRUE)
    for(i in 1:4){
      iris_na[is.na(iris_na[,i]),i]] = mean_value[i]
    summary(iris_na)#可以计算mean了,说明现在没有na了
    describe(iris_na)#看看此时na是不是150了
    

    14:20新创立一个数据集

    >cancer <- data.frame(id= 1:1000,#replace=T,可以设置重复取值
                        sur_days=sample(100:1000,1000,replace =TRUE),
                        type= sample(c('colon','liver','lung'),1000,replace =TRUE),
                        treatment = sample(c('chemo','sugr'),1000,replace = T))
    > cancer
         id sur_days  type treatment
    1     1      193 colon     chemo
    2     2      273 colon      sugr
    3     3      551 liver      sugr
    4     4      830 liver      sugr
    5     5      457  lung     chemo
    6     6      207  lung      sugr
    ##随机生成一些确实值
    cancer[sample(1:1000,90),2]<-NA
    mean_value<- tapply(cancer$sur_days,list(cancer$type,cancer$treatment),mean,na.rm=TRUE)
    > mean_value
             chemo     sugr
    colon 532.6167 564.6667
    liver 583.8652 566.6500
    lung  549.1429 582.9648
    for(i in 1:3){
      for(j in 1:2){
        cancer$sur_days[is.na(cancer$sur_days)&cancer$type == rownames(mean_value)[i]& cancer$treatment == colnames(mean_value)[j]]= mean_value[i,j]
    }#因为上面的mean——value是有两个维度的所以要有i和j两个变量
    

    21.缺失值的识别与处理(2)

  • 缺失值的识别与处理
  • rm(list = ls())
    library(mlbench)
    data('BostonHousing')
    head(BostonHousing)
    original_data<-BostonHousing
    set.seed(2017)
    BostonHousing[sample(1:nrow(BostonHousing),80),'rad']<-NA #生成缺失值
    BostonHousing[sample(1:nrow(BostonHousing),80),'PTRATION']<-NA
    library(mice)
    md.pattern(BostonHousing) 
    library(Hmisc)
    im_mean<-impute(BostonHousing$ptratio,median)
    head(im_mean)
    BostonHousing$ptratio<-NULL
    
  • mice包进行缺失值的插补
  • mice_mod<-mice(BostonHousing[,!names(BostonHousing)%in% 'medv'],method = 'rf')#rf是随机森林的缩写,不要把medv这个变量放进来,接下来做回归分析把缺失值的作为因变量,其他不含缺失值变量的作为自变量,建立一种模型来进行回归,对因变量进行估计,最后预测那些缺失值是多少。现在ptratio因为含有缺失值,就是这里面的因变量 mice_output<-complete(mice_mod) actuals <- original_data$rad[is.na(BostonHousing$rad)] predics<-mice_output[is.na(BostonHousing$rad)] mean(actuals!=predicts) md.pattern(airquality) aggr_plot<-aggr(airquality,col=c('red','green'),numbers=TRUE,sortVars = TRUE,labels = names(airquality),cex.axis = 0.7,gap = 3) #numbers真是把缺失值和不缺失值的比例显示出来,sortVars是根据缺失值的多少进行排序 #另一个可视化的函数 marginplot(airquality[1:2])
    #把因变量的值当成未知,用自变量对其预测
    data(sleep)
    head(sleep)
    sleepIm<-regressionImp(Sleep+Gest+Span+Dream+NonD~BodyWgt+BrainWgt,data=sleep)
    head(sleepIm)
    #因变量放在公式的左边,就是在~左边。得到的TRUE表示之前此处是缺失值
    #因变量有连续性变量和离散型变量,如果知道左侧的因变量都是分类变量面就可以用family='logical',如果不知道,就用family='auto'
    sleepIm<-regressionImp(Sleep+Gest+Span+Dream+NonD~BodyWgt+BrainWgt,data=sleep,family='auto')
    head(sleepIm)
    

    22.异常值和重复值的处理

    > paste(stringa,STRINGB,sep = '-') [1] "A-1" "B-2" "C-3" "D-4" "E-5" > paste(stringa,STRINGB,collapse = '-') [1] "A 1-B 2-C 3-D 4-E 5" > paste0(stringa,STRINGB) [1] "A1" "B2" "C3" "D4" "E5" > paste0(stringa,STRINGB,sep = '-') [1] "A1-" "B2-" "C3-" "D4-" "E5-" > paste0(stringa,STRINGB,collapse = '-') [1] "A1-B2-C3-D4-E5" > stringC<-paste(stringa,STRINGB,sep = '/') > stringC [1] "A/1" "B/2" "C/3" "D/4" "E/5" > strsplit(stringC,split = '/') [[1]] [1] "A" "1" [[2]] [1] "B" "2" [[3]] [1] "C" "3" [[4]] [1] "D" "4" [[5]] [1] "E" "5" > stringd<-c('sheng','xin','ji','neng','shu') > sub_str<-substr(stringd,start = 2,stop = 4) > sub_str [1] "hen" "in" "i" "eng" "hu" > substr(stringd,start = 2,stop = 4)<-'aaa' > stringd [1] "saaag" "xaa" "ja" "naaa" "saa" > my_string <- c('above','about','abrotion','cab') > grep('ab\\b',my_string,value = T) [1] "cab" > grep('\\bab',my_string,value = T) [1] "above" "about" "abrotion" > money<-c('$1888','$2888','$3888') > as.numeric(money) [1] NA NA NA Warning message: 强制改变过程中产生了NA > gsub('\\$',replacement = '',money) [1] "1888" "2888" "3888" > sub('\\$',replacement = '',money) [1] "1888" "2888" "3888" > money2<-c('$1888 $2888 $3888') > sub('\\$',replacement = '',money2) [1] "1888 $2888 $3888" > test_string<- c('happy','apple','application','apolitic') > regexpr('pp',test_string) [1] 3 2 2 -1 attr(,"match.length") [1] 2 2 2 -1 attr(,"index.type") [1] "chars" attr(,"useBytes") [1] TRUE > test_string[regexpr('pp',test_string)>0] #不匹配的就是-1 [1] "happy" "apple" "application" > agrep()#匹配英美式 Error in agrep() : 缺少参数"pattern",也没有缺省值 > string1<-c('I need a favour','my favorite report','you made an error') > agrep('favor',string1) [1] 1 2 ***** 星号匹配零个或多个前面的字符。例如, a* 可以匹配 ab 和 aaab. 它还可以匹配完全不包含 "a" 的任意字符串的开始处.通配符: 句点星号模式 .* 是匹配范围最广的模式之一, 因为它可以匹配零个或多个 任意 字符 (除了新行符: r 和n). 例如, abc.*123 可以匹配 abcAnything123, 也能匹配 abc123. 问号匹配零或一个前面的字符,可以理解为 "前面的那项是可选的". 例如, colou?r 可以匹配 color 和 colour, 因为 "u" 是可选的. 加号匹配一个或多个前面的字符,例如 a+ 可以匹配 ab 和 aaab. 但与 a+a? 不同的是, 模式 a+ 不会匹配开始处没有 "a" 的字符串. {min,max} 匹配出现次数介于 minmax 的前面的字符, 例如, a{1,2} 可以匹配 ab 但只匹配 aaab 中的前两个 a.此外, {3} 表示准确匹配 3 次, 而 {3,} 则表示匹配 3 次或更多. 注: 且第一个必须小于等于第二个. [...] 字符类: 方括号把一列字符或一个范围括在了一起 (或两者). 例如, [abc] 表示 "a, b 或 c 的中任何一个字符". 使用破折号来创建范围; 例如, [a-z] 表示 "在小写字母 a 和 z (包含的) 之间的任何一个字符". 列表和范围可以组合在一起; 例如 [a-zA-Z0-9_] 表示 "字母, 数字或下划线中的任何一个字符".字符类后面可以使用 *, ?, + 或 {min,max} 进行限定. 例如, [0-9]+ 匹配一个或多个任意数字; 因此它可以匹配 xyz123 但不会匹配 abcxyz. [^...] 匹配 在类中的任何一个字符. 例如, [^/]* 匹配零个或多个 不是 正斜杠的任意字符, 例如 , [^0-9xyz] 匹配既不是数字也不是 x, y 或 z 的任何一个字符. 匹配任意一个数字 (相当于类 [0-9]). 相反地,大写的\D表示“任意的 数字字符”。 例如, [\d.-] 表示 "任何数字, 句点或负号". 匹配任意单个空白字符 , 主要是==空格, tab 和新行符 (r 和n==). 相反地, 大写的 \S 表示 "任何 空白字符". 匹配任何==单个 "单词"== 字符, 即==字母, 数字或下划线==. 这等同于 [a-zA-Z0-9_]. 相反地, 大写的 \W 表示 "任何 单词字符". > ###2.转移表达式 > mystring2<-c('shuda','.dfs','-dsfd') > grep('.',mysting2) #.作为pattern的话,是一个转义表达式,代表所有字符,包括它自己 [1] 1 2 3 > mystring3<-c('9aee','fese7','10000') > grep('[7-9]',mystring3) [1] 1 2 > grep('[0-1]',mystring3) [1] 3 > grep('[0-6]',mystring3) [1] 3 > mystring4<-c('apple','application','abb') > grep('^ap',mystring4) [1] 1 2 > mystring3<-c('9aee','fese7','10000') > grep('[^0-1]',mystring3) [1] 1 2 > grep('[^7-9]',mystring3) [1] 1 2 3 > grep('[^2-6]',mystring3) [1] 1 2 3 > mystring3<-c('9aee','fese7','50000') > grep('[^0-1]',mystring3) [1] 1 2 3 > mystring6<-c('1220','2267','2226','12333') > grep('2{2,3}',mystring6) #重复2到3次 [1] 1 2 3 > grep('2{2,}',mystring6) #重复大于等于2次的返回 [1] 1 2 3 > mystring7<-c('food','foot','foul','fans') > grep('fo{1,}',mystring7)#只对o起作用 [1] 1 2 3 > grep('fo+',mystring7) [1] 1 2 3 > grep('(fo){1,}',mystring7) [1] 1 2 3 > mystring8<-c('kobe','messi','neymar') > grep('^k|^m',mystring8) [1] 1 2 > mystring9<-c('active','positive','negative','love') > grep('ive$',mystring9) [1] 1 2 3 > grep('ive\\b',mystring9) #\\b:boundry [1] 1 2 3 > ###保义符 > mystring10<-c('ac^bb','^df') > grep('\\^',mystring10) [1] 1 2

    25.stringr&stringi包

    > ###stringr
    > library(stringr)
    > library(stringi)
    > str_c('a','b',sep = '-') #与paste类似
    [1] "a-b"
    > str_length() #nchar()
    Error in stri_length(string) : 缺少参数"string",也没有缺省值
    > jns <- 'sheng xin ji neng shu'
    > str_sub(jns,c(1,4,8),c(2,6,11)) #与substr()类似
    [1] "sh"   "ng "  "in j"
    > str_sub(jns,1,1)<-'S'
    [1] "Sheng xin ji neng shu"
    > fruit<-c('apple','pear','banana')
    > str_dup(fruit,2)
    [1] "appleapple"   "pearpear"     "bananabanana"
    > str_dup(fruit,2:4)
    [1] "appleapple"               "pearpearpear"            
    [3] "bananabananabananabanana"
    > str_dup(fruit,2:5) #循环补齐
    [1] "appleapple"                "pearpearpear"             
    [3] "bananabananabananabanana"  "appleappleappleappleapple"
    Warning message:
    In stri_dup(string, times) :
      longer object length is not a multiple of shorter object length
    > string<- ' Eternal love for jns '
    > str_trim(string ,side = 'both')
    [1] "Eternal love for jns"
    > phones<- c(' 219 733 8965','329-356-765 ','banana','456 789 234','764 126 893','apple','233.456.7656 ','333 555 7777','123 234 3456 and 456 567 6789','Work:333-666-8888','$1000','Home: 543.355.6790')
    > str_extract(phones,'([1-9][0-9]{2})[- .]([0-9]{3})[- .]([0-9]{4})') #{}内是重复几次
     [1] "219 733 8965" NA             NA             NA            
     [5] NA             NA             "233.456.7656" "333 555 7777"
     [9] "123 234 3456" "333-666-8888" NA             "543.355.6790"
    > str_extract(phones,'([1-9][0-9]{2})[- .]([0-9]{3})[- .]([0-9]{3,})') #{}内是重复几次
     [1] "219 733 8965" "329-356-765"  NA             "456 789 234" 
     [5] "764 126 893"  NA             "233.456.7656" "333 555 7777"
     [9] "123 234 3456" "333-666-8888" NA             "543.355.6790"
    > fruits<-c('one apple','two pears','three bananas')
    > str_replace(fruits,'[aeiou]','-')
    [1] "-ne apple"     "tw- pears"     "thr-e bananas"
    > ###stringi
    > stri_join(1:7,letters[1:7], sep='-')
    [1] "1-a" "2-b" "3-c" "4-d" "5-e" "6-f" "7-g"
    > stri_join(1:7,letters[1:7], collapse = '-')
    [1] "1a-2b-3c-4d-5e-6f-7g"
    > stri_cmp_eq('AB','aB')
    [1] FALSE
    > stri_cmp_neq('AB','aB')
    [1] TRUE
    > stri_cmp_lt('121','221')#不是当成数值比较,而是当成字符串比较,前者小于后者
    [1] TRUE
    > stri_cmp_lt('a121','b221')
    [1] TRUE
    > stri_cmp_lt('c121','b221')
    [1] FALSE
    > stri_cmp_gt('e121','b221')
    [1] TRUE
    > stri_cmp_gt('e321','b221')
    [1] TRUE
    > language<-c('Python','R','PHP','Ruby','Java','JavaScript','C','Oracle','C++','C#','Spark','GO','Room','Good','Pathon','ScriptJava','R2R','C+','C*')
    > stri_count(language,fixed = 'R')
     [1] 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 2 0 0
    > stri_count(language,regex = '^J')
     [1] 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
    > test<-'The\u00a0aboue-mentioned   features are very useful.  Warm thank to you.   Tomorrow is a, new $# day##'
    > stri_count_boundaries(test,type='word')
    [1] 44
    > stri_count_boundaries(test,type='sentence')
    [1] 3
    > stri_count_boundaries(test,type='character')
    [1] 97
    > stri_dup(c('abc','pqrst'),c(4,2))
    [1] "abcabcabcabc" "pqrstpqrst"  
    > stri_duplicated(c('a','b','a',NA,'a',NA))
    [1] FALSE FALSE  TRUE FALSE  TRUE  TRUE
    > stri_duplicated(c('a','b','a',NA,'a',NA),fromLast = T) #从后往前判断
    [1]  TRUE FALSE  TRUE  TRUE FALSE FALSE
    > stri_duplicated_any(c('a','b','a',NA,'a',NA))
    [1] 3
    > stri_detect_fixed(c('stringi R','Rexamine','123'),c('i','R','0'))
    [1]  TRUE  TRUE FALSE
    > stri_detect_regex(c('apple','application','append','ape'),'^ap')
    [1] TRUE TRUE TRUE TRUE
    > stri_detect_regex(c('apple','application','append','ape'),'^app')
    [1]  TRUE  TRUE  TRUE FALSE
    > stri_detect_regex(c('apple','application','append','ape'),'e\\b')
    [1]  TRUE FALSE FALSE  TRUE
    > stri_detect_regex(c('APPLE','application','appEND','ape'),'e\\b',case_insensitive = TRUE) #这个case_insensitive(忽略大小写)为什么不能补齐呢?
    [1]  TRUE FALSE FALSE  TRUE
    > stri_startswith_fixed(c('a1','a2','b3','a4','c5'),'a')
    [1]  TRUE  TRUE FALSE  TRUE FALSE
    > stri_startswith_fixed(c('a1','a2','b3','a4','c5'),'a1')
    [1]  TRUE FALSE FALSE FALSE FALSE
    > stri_startswith_fixed(c('abada','aabadc','abaee'),'ba',from = 2)
    [1]  TRUE FALSE  TRUE
    > stri_endswith_fixed(c('abaDC','aabadc','ababa'),'ba')
    [1] FALSE FALSE  TRUE
    > stri_endswith_fixed(c('abaDC','aabadc','ababa'),'ba',to = 3)
    [1]  TRUE FALSE  TRUE
    > stri_extract_all_fixed('abaBAba','Aba',case_insensitive = TRUE,overlap=T)
    [[1]]
    [1] "aba" "aBA" "Aba"
    > stri_extract_all_boundaries('stringi: THE string processing package 123.45...')
    [[1]]
    [1] "stringi: "   "THE "        "string "     "processing " "package "   
    [6] "123.45..."  
    > stri_extract_all_words('stringi: THE string processing package 123.45...')
    [[1]]
    [1] "stringi"    "THE"        "string"     "processing" "package"   
    [6] "123.45"    
    > stri_isempty(c(',','','123'))
    [1] FALSE  TRUE FALSE
    > stri_locate_all('I love biotree, I love jinengshu',fixed = 'lo')
    [[1]]
         start end
    [1,]     3   4
    [2,]    19  20
    
  • {2,4}匹配2到4次。\\b边界,放在最后就是右边界
  •