主要基于data.frame类型,介绍初阶的数据管理知识点
要点一、调整结构
1、编辑变量名
#法1
fix(mydata) #调出交互编辑器,直接修改
#法2 编程方式
names(mydata) #可返回所有变量名(列名)= colnames()
names(mydata)[2] = "2"
names(mydata)[2:5]=c("2","3","4","5") #修改变量名
如果数据表比较大,变量名较多,可直接指定变量名修改;需要安装一个包plyr
mydata <- rename(mydata,
c(2="q2", 3="q3"))
# oldname="newname"
2、创建新变量(列)
#法1
mydata <- data.frame(x1 = c(2, 2, 6, 4),
x2 = c(3, 4, 2, 8))
mydata$sumx <- mydata$x1 + mydata$x2
mydata$meanx <- (mydata$x1 + mydata$x2)/2
#法2
attach(mydata)
mydata$sumx <- x1 + x2
mydata$meanx <- (x1 + x2)/2
detach(mydata)
#法3 (作者推荐)
mydata <- transform(mydata,
sumx = x1 + x2,
meanx = (x1 + x2)/2)
- 补充:一些实用运算符
+-*/
四则远算
^
或者**
指数幂运算
9%%2
求余数,返回1
9%/%2
返回4
3、合并数据框
- 按列合并,添加变量
#法1,按索引合并(有相同列)
total1=merge(dataframeA,dataframeB,by="ID","Country")
#法2,直接合并
total2=cbind(A,B)
- 按行合并,添加观测
total=rbind(A,B) #必须有相同的变量
4、数据排序
-
order()
默认的排序是升序;在指定变量名前加一个减号即为降序
newdata=leadership[order(leadership$gender),]
newdata=leadership[order(leadership$gender,-leadership$age),]
#存在两个排序依据时,先按第一个整体排序,再按第二个进行微调
#可用attach 方便些
5、数据重编码(比如根据年龄分组)
#首先把列中的明显不合理值编码为缺失项 NA
leadership$age[leadership$age == 99] <- NA
# == 为等于 = 是赋值
#注意一些逻辑运算符的描述方式, != 表示不等于
#再将年龄分为三段
leadership$agecat[leadership$age > 75] <- "Elder" #老年组
leadership$agecat[leadership$age >= 55 &
leadership$age <= 75] <- "Middle Aged" #中年组
leadership$agecat[leadership$age < 55] <- "Young" #年轻组
- 补充1:一些实用比较符
<
<=
>
>=
!=
不等于;
x & y
和;x | y
或 ;!x
:用法见上例 - 补充2:一些包提供了方便的变量重编码函数,如car包的recode()函数、doBy包的recodevar()函数。
要点二、取数据子集
1、选取指定列
newdata1 <- leadership[, c(6:10)]
myvars <- c("q1", "q2", "q3", "q4", "q5")
newdata2 <-leadership[myvars]
2、去除指定列
#法1
myvars <- names(leadership) %in% c("q3", "q4") #确定要去除的目标
myvars
!myvars
leadership[!myvars]
#法2
mydata=subset(mydata,select = -X) #删除名为X的列
#法3
mydata=mydata[,-1] #删除第1列
mydata <- mydata[c(-3,-4)] #删除第3、4列
3、观测行操作
- 3.1 选子集
newdata <- mydata[1:3,]
newdata <- medata[mydata$gender=="M" &
mydata$age > 30, ]
#如下可同时挑选指定观测与变量
newdata <- subset(mydata,gender=="M",
select=gender:age)
- 3.2 抽样样本
mysample <-mydata[sample(1:nrow(mydata),3,replace=FALSE),]
# 随机不放回得抽取三份样本
要点三、特殊数据格式
1、缺失值
- 缺失值NA(Not Available,表示不可用):因该数据未作答,设备故障或其它原因而缺失。
is.na() #该函数用于检测缺失值
#返回逻辑值,TRUE/FALSE
is.na(leadership[, 6:10])
- 注意:例如类似5/0 返回的是
Inf
(无穷值),NaN
(not a number) 则表示不可能的值。 - 在分析中排除缺失值的方法
使用na,rm=TRUE
参数,多数数值处理函数都有该选项,否则返回的还是NA值;
na.omit()
命令可以直接删除所有含有缺失值的行(观测)。
2、日期格式
-
as.Date()
可将字符串型的日期值,转化为专用的日期型变量,进行日期的有关分析;
#默认输入格式为例如2020-01-11,若不是则需要加以说明
mydate=as.Date("2008-12-06")
class(mydate)
str(mydate)
#如果是其它格式的日期,需要特别说明一下
mydate=as.Date("01/05/1965","%m/%d/%Y")
- 其它格式说明
%d
-- 日
%m
-- 月份(数字形式)%b
-- 缩写英文月份%B
-- 英文月份
%y
-- 年(后两位数)%Y
-- 四位数
%a
-- 缩写英文星期%A
-- 英文星期
as.character() 与之相反,可将日期值转换为字符型
小技巧~
- 想知道某天是周几
format(mydate,format="%A") #返回星期
- 今天几号?
Sys.Date() #可返回今天的日期
date() #可返回当前的日期和时间
- 日期加减
#日期格式可以直接加减,也可以使用函数difftime()
difftime(today,someday,units="weeks") #以周数为单位返回日期差值
3、格式判断与转换
- 判断函数 ,返回逻辑值。在控制流时有用。
is.numeric()
is.character()
is.vector()
is.matrix()
is.data.frame()
is.factor()
is.logical()
- 转换,相应的变为as.即可;比如
as.data.frame()
补充:在dplyr包中有一种data.frame简化版的tibble数据框,参考文章,了解下即可(个人认为还是data.frame格式常用)