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}
匹配出现次数介于 min 和 max 的前面的字符, 例如, 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
边界,放在最后就是右边界