一、类型转换
函数 | 描述 |
as.numeric() | 数字类型 |
as.character() | 字符类型 |
as.vector() | 向量类型 |
as.matrix() | 矩阵类型 |
as.array() | 数组类型 |
as.data.frame() | 数据框类型 |
as.list() | 列表类型 |
as.factor() | 因子类型 |
as.logical() | 逻辑类型 |
unlist() | 把list类型转变为字符型向量 |
(num<-1:10) #向量
str(num);dim(num);mode(num);class(num);typeof(num)
(num_frame<-as.data.frame(num)) #数据框
str(num_frame);dim(num_frame);mode(num_frame);class(num_frame);typeof(num_frame)
sapply(num_frame,typeof);sapply(num_frame,class)
(num_char<-as.character(num)) #字符型
(list<-list(num=num,char=num_char)) #列表
(list_frame<-as.data.frame(list)) #把列表类型转换成数据框类型
(list_vector<-unlist(list)) #把list类型转换为向量类型
二、排序order|sort|rank
#sort(x, decreasing = FALSE, ...),用于向量排序
#order(..., na.last = TRUE, decreasing = FALSE),可以用于多维的排序
#rank(x, na.last = TRUE, ties.method = c("average", "first", "random", "max", "min"))
#1.x表示需要排序的数据,
#2.decreasing表示是否按降序排序数据,
#3.method表示所使用的排序算法,
#4.na.last用来说明如何处理NA值,如果为FALSE,则会删除这些值,如果为TRUE,就会把这些值放到最后。
#5.order()的返回值是对应“排名”的元素所在向量x中的位置
#6.sort(x)是对向量x进行排序,返回值排序后的数值向量
#7.rank(x)是求秩的函数,它的返回值是这个向量中对应元素的“排名”
x<-c(18,83,64,1)
order(x) #显示结果为4 1 3 2
sort(x) #显示结果为1 18 64 83
rank(x)# 显示结果为2 4 3 1
mydata<-data.frame(ID=sample(LETTERS[1:3],8,replace = T),score=c(2,5,3,2,7,8,3,9))
mydata[order(mydata$ID),] #按ID列升序
mydata[order(mydata$ID,decreasing=T),] #按ID列降序
三、去重unqiue函数
(mydata<-data.frame(ID=c("A","B","B","C","A","A"),data=c(1,2,1,1,2,1)))
unique(mydata$ID) #按ID去重,ID变量为因子型,因附带Levels统计指标
unique(mydata[,1:2]) #按多维组合进行去重
四、数据框的合并和匹配cbind|rbind|merge
(y1<-data.frame(day=c(1,2,3,4,5),user=c(100,200,300,400,500)))
(y2<-data.frame(day=c(1,2,3,4,5),user=c(1000,1500,1800,2000,3000)))
#列合并,要求y1和y2有相同的行数
(x1<-cbind(y1,y2))#可以同时合并更多
(x2<-cbind(1,y1,2,y2))#第一列赋值1,第三列赋值2
#行合并,要求y1和y2有相同的列数并且列名称要一致
(x3<-rbind(y1,y2))
(data1<-data.frame(names1=c("jet","tina","melisa","zu","nothing","elliot"),level=c(21,31,34,15,53,61)))
(data2<-data.frame(names2=c("jet","tina","melisa","stone","dich"),pay=c(1300,563,83,854,369)))
merge(data1,data2,by.x = "names1",by.y = "names2") #相同取值的行进行合并,其他的丢掉
merge(data1,data2,all = TRUE) #把data1的每一行和data2的每一行合并一次
#如果两个数据框要匹配的字段名字都一样,则可以直接用by="字段名称"来进行匹配
五、分组aggregate|apply|tapply|table
#举例1:aggregate
names<-LETTERS[1:8]
lv<-c(10,10,30,30,40,40,50,60)
type<-c(1,2,2,1,3,3,1,2)
vip<-c(1,0,0,1,0,1,1,1)
amount<-c(15,35,75,90,200,150,400,350)
(mydata<-data.frame(names,lv,type,vip,amount))
#根据type统计lv和amount的平均值
dput(names(mydata))
aggregate(mydata[,c("lv","amount")],by=list(mydata$type),FUN = mean)
aggregate(lv~type,mydata,mean)
#根据type&vip统计lv和amount的平均值
aggregate(mydata[,c("lv","amount")],by=list(mydata$type,mydata$vip),FUN = mean)
#根据type&vip统计lv和amount的平均值&总和
fun<-function(x){c(mean=mean(x),sum=sum(x))}
aggregate(mydata[,c("lv","amount")],by=list(mydata$type,mydata$vip),FUN = fun)
#举例2:apply
#apply函数对一个数组按行或按列进行计算
#apply(x,MARGIN,FUN,...)
#x为一个数组,MARGIN为一个向量(表示要将函数FUN应用到X的行还是列),若为1表示取行,为2表示取列,为c(1,2)表示行、列都计算
apply(data.frame(mydata$lv,mydata$amount),1,sum)#按行求和
apply(data.frame(mydata$lv,mydata$amount),2,sum)#按列求和
#举例3:tapply
#tapply(X, INDEX, FUN = NULL, ..., simplify = TRUE)
#其中X通常是一向量;
#INDEX是一个list对象,且该list中的每一个元素都是与X有同样长度的因子;
#FUN是需要计算的函数;
#simplify是逻辑变量,若取值为TRUE(默认值),且函数FUN的计算结果总是为一个标量值,那么函数tapply返回一个数组;若取值为FALSE,则函数tapply的返回值为一个list对象。
#需要注意的是,当第二个参数INDEX不是因子时,函数 tapply() 同样有效,因为必要时 R 会用 as.factor()把参数强制转换成因子。
#利用tapply实现类似于excel里的数据透视表的功能:
tapply(mydata$amount,list(mydata$type,mydata$vip,mydata$lv),sum)
联系客服