打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
R:类型转换|排序|去重|匹配|分组

一、类型转换

函数描述
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)



本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
R 中计算数据框中相同ID的均值 标准差 和删除行(记录或者观测)中重复的数据
R数据分析:apply()的各种变体你分清了吗?
R中的高效批量处理函数(lapply sapply apply tapply mapply)
R语言学习-基础篇1
R语言基础知识——子集的提取(2)
R语言学习
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服