因子(factor)是R语言中许多强大运算的基础,因子的设计思想来着统计学中的名义变量(分类变量),因子可以简单的看做一个附加了更多信息的向量。
使用方法:factor(x=character(),levels,labels=levels,exclude = NA,ordered = is.ordered(x),nmax=NA)
不像向量、矩阵与数据框比较直观,很好理解,因子不太好使用语言描述,但是代码很直观,能很直观的返回对象的水平。
> myvector <-c("T","F","T","T") #向量
> myfactor <- factor(myvector)
> myfactor
[1] T F T T
Levels: F T
注意返回值第二行有一个水平,值得是myvector只有F和T,两个水平。
第一行可以理解诶myvector转换为因子后的结果。
因子的索引与向量操作差不多,但是返回的原因子水平
> myvector <-c("T","F","T","T") #向量
> myfactor <- factor(myvector)
> myfactor
[1] T F T T
Levels: F T
> myfactor[c(1,2)] #取1,2个水平不变
[1] T F
Levels: F T
> myfactor[c(3,4)] #取1,2个水平不变
[1] T T
Levels: F T
与向量也差不多,最简单的方法就是赋值
> myfactor[3] <- "F"
> myfactor
[1] T F F T
Levels: F T
当然还有其他操作,差不多都可以参照向量,特别说明:因子不是向量,他们只是像,因子的类型是因子型,与向量不同
> data1 <- data.frame(name = c("李小华","张蜜桃","刘大灰","李佳怡"),"性别" = c("女","女","男","男"),age = c(18,19,23,21),hight = c(175,173,167,177))
> #name,性别,age是列名
> data1
name 性别 age hight
1 李小华 女 18 175
2 张蜜桃 女 19 173
3 刘大灰 男 23 167
4 李佳怡 男 21 177
> class(data1)
[1] "data.frame"
> tapply(data1$hight,data1$性别,mean) #以上是对性别进行分组后,对身高进行求均值,返回男的身高平均值,女的身高平均值
男 女
172 174
> #如果想用分多组,就用因子列表
> tapply(data1$hight,list(data1$性别,data1$name),mean)
李佳怡 李小华 刘大灰 张蜜桃
男 177 NA 167 NA
女 NA 175 NA 173
2.split()函数
和tapply()函数不同,split()只分组,x可为数据框或向量,返回值是列表
> split(data1$name,data1$性别)#对name按照性别进行分组,结果返回列表,标签是分组水平
$男
[1] "刘大灰" "李佳怡"
$女
[1] "李小华" "张蜜桃"
4.aggregate(x,list,f)函数,其中x为向量/数据框/矩阵,第二个参数必须为list,f是函数。该函数可以安装要求打组聚合,然后对聚合以后得数据进行加和,求平均等各种操作
> data1
name 性别 age hight
1 李小华 女 18 175
2 张蜜桃 女 19 173
3 刘大灰 男 23 167
4 李佳怡 男 21 177
> aggregate(data1[,c(3,4)],list(data1$性别),mean)#按照性别聚合后,对age与hight进行求期望
Group.1 age hight
1 男 22.0 172
2 女 18.5 174
R中表指的是列联表
1,table()函数
常用与统计向量频数
> a <- c(1,2,2,3,4,5,6,4,1,4,5,6,4,3)
> table(a)
a
1 2 3 4 5 6
2 2 2 4 2 2
注意表可以如同矩阵一样访问
> table(a)[3]
3
2
> list1<-list(c(2,2,2,3,4,5),c(6,6,7,7,8,8))
> table(list1)
list1.2
list1.1 6 7 8
2 2 1 0
3 0 1 0
4 0 0 1
5 0 0 1
> table(list1)[3,]
6 7 8
0 0 1
2.cut()函数
cut(x,b,labels = FALSE)是生成因子的一种常用方法,常用与表操作,这个函数用法很负责
> data1 <- data.frame(name = c("李小华","张蜜桃","刘大灰","李佳怡"),"性别" = c("女","女","男","男"),age = c(18,19,23,21),hight = c(175,173,167,177))
> #name,性别,age是列名
> aa <- cut(data1$hight,breaks = c(-Inf,160,170,175,182,Inf), labels = c("不评价","还行","很好","喜欢","哇!"))
>
> data1 <- cbind(data1,aa)
> data1
name 性别 age hight aa
1 李小华 女 18 175 很好
2 张蜜桃 女 19 173 很好
3 刘大灰 男 23 167 还行
4 李佳怡 男 21 177 喜欢
字符串比较简单,基本上就是一些函数,字符串在文本挖掘中很重要,使用正则表达式很方便
1.字符串长度
使用nchar()函数求字符串长度
2.字符串合并
使用paste()函数求字符串长度
3.字符串分割
使用strsplit()函数分割字符串,返回的是列表
4.读取字符串
使用substr()读取字符串,substr(x,start,stop)
5.字符串替换
使用chartr()函数替换元素,chartr(old,new,x),把x的old换成new的
6,多个组件合成一个字符串
使用sprintf()函数
t <- c("hello world")
nchar(t)
#字符串合并
a2 <- "我是坤"
a3 <- "绰号只因"
a4 <- paste(a2,a3,sep = "-坤粉说-")
a4
#字符串分割
a5 <- "你~在~干~什~么?"
strsplit(a5,"~")
> a6 <- "读取字符串"
> substr(a6,3,5)
[1] "字符串"
> chartr("字符","zifu",a6) #长度要相等,不然要出问题
[1] "读取zi串"
> a9 <- 666
> hh <- sprintf("你真%d",a9) #a数据替换了%d
> hh
[1] "你真666"
> a10 <- "哎呦"
> a11 <- 6
> h1 <- sprintf("你干嘛!%s,%d",a10,a11) #%s是接受字符串型的数据
> h1
[1] "你干嘛!哎呦,6"
正则表达式就是找相同,作用范围非常广
X向量,后面参数比较复杂
> a1 <- c("Aa","english","Chinese")
> grep("Aa",a1)
[1] 1
> grep("[en]",a1) #返回有en的元素位置
[1] 2 3
> grep("l.s",a1) #查找l与s,中间有一个随便的元素,返回2
[1] 2
> grep("e..l",a1) #查找e至l,中间有两个元素
[1] 2
3.regexpr(pattern,text)、gregexpr(pattern,text)函数
regexpr(pattern,text,ignore.case = FALSE,perl = FALSE,fixed = FALSE,useBytes =FALSE),返回一个与给出第一个匹配的起始位置的文本长度相同的整数向量,如果没有则返回-1
> a2 <- c("asdasdv","wertsdasv","sdvasd")
> regexpr("sdas",a2)
[1] 2 5 -1
attr(,"match.length")
[1] 4 4 -1
attr(,"index.type")
[1] "chars"
attr(,"useBytes")
[1] TRUE
gregexpr(pattern,text,ingore.case =FALSE,perl =FALSE,fixed = FALSE,useBytes =FALSE),返回一个与文本长度相同的列表,每个元素的格式与regexpr的返回值相同,除了给出了每个(不想交)匹配的起始位置
> a2 <- c("asdasdv","wertsdasv","sdvasd")
> gregexpr("sdas",a2)
[[1]]
[1] 2
attr(,"match.length")
[1] 4
attr(,"index.type")
[1] "chars"
attr(,"useBytes")
[1] TRUE
[[2]]
[1] 5
attr(,"match.length")
[1] 4
attr(,"index.type")
[1] "chars"
attr(,"useBytes")
[1] TRUE
[[3]]
[1] -1
attr(,"match.length")
[1] -1
attr(,"index.type")
[1] "chars"
attr(,"useBytes")
[1] TRUE
注意:正则表达式有很多使用场景,多用于处理文本,比较复杂
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。