文章目录
  1. 基本数据管理
    1. 1、创建新变量
    2. 2、变量重编码
    3. 3、变量的重命名
    4. 4、缺失值处理
    5. 5、日期值
    6. 6、类型判断
    7. 7、数据排序
    8. 8、数据集合并
    9. 9、数据集取子集
    10. 10、SQL语句操作数据框

基本数据管理

1、创建新变量

1
2
3
4
5
6
7
8
9
10
11
12
13
#方法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)

2、变量重编码

需要使用逻辑运算符:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#示例数据:
manager<-c(1,2,3,4,5)
date<- c("10/24/08","10/28/08","10/1/08","10/12/08","5/1/09")
country<- c("US","US","UK","UK","UK")
gender<-c("M","F","F","M","F")
age<-c(32,45,25,39,99)
q1<-c(5,3,3,3,2)
q2<-c(4,5,5,3,2)
q3<-c(5,2,5,4,1)
q4<-c(5,5,5,NA,2)
q5<-c(5,5,2,NA,1)
leadership<-data.frame(manager,date,country,gender,age,q1,q2,q3,q4,q5,stringsAsFactors = FALSE)
manager date country gender age q1 q2 q3 q4 q5
1 1 10/24/08 US M 32 5 4 5 5 5
2 2 10/28/08 US F 45 3 5 2 5 5
3 3 10/1/08 UK F 25 3 5 5 5 2
4 4 10/12/08 UK M 39 3 3 4 NA NA
5 5 5/1/09 UK F 99 2 2 1 2 1

(1)将年龄99重编码为缺失值

1
2
leadership$age[leadership$age == 99] <-NA
#variable[condition] <- expression将仅在condition的值为TRUE时执行赋值

(2)创建agecat变量

1
2
3
4
5
6
7
8
9
leadership$agecat[leadership$age>75] <-"Elder"
leadership$agecat[leadership$age>=55 & leadership$age<=75] <-"Middle Aged"
leadership$agecat[leadership$age<55] <-"Young"
#更紧凑的写法:within类似于with不过可以修改数据
leadership<-within(leadership,{
agecat <- NA
agecat[leadership$age>75] <-"Elder"
agecat[leadership$age>=55 & leadership$age<=75] <-"Middle Aged"
agecat[leadership$age<55] <-"Young"})

3、变量的重命名

(1)交互方式:fix(leadership)

(2)编程方式:

1
2
3
4
#(需要安装包library(reshape))
rename(dataframe,c(oldname="newname", oldname="newname",…))
names(leadership)[1] <- "managerID"
names(leadership)[6:10]<- c("1","2","3","4","5")

4、缺失值处理

(1)识别:is.na(y),不可使用逻辑测试yvar==NA,永远为false,R中NA为关键字表示缺失值

(2)重编码为缺失值:见2

(3)分析中排除缺失值:
诸多函数中含有排除缺失值的参数,

1
2
3
4
x<-c(1,2,NA,3)
y<-sum(x)#y=NA
y<-sum(x,na.rm = TRUE)
#另一种方式行删除:na.omit(leadership),删除含有缺失值的行,更复杂的方式见后续。

5、日期值

(1)字符型变量转化为数值形式的日期变量,as.Date(x,"input_format")

  • %d 数字表示的日期(0~31) 01~31
  • %a 缩写的星期名 Mon
  • %A 非缩写星期名 Monday
  • %m 月份(00~12) 00~12
  • %b 缩写的月份 Jan
  • %B 非缩写月份 January
  • %y 两位数的年份 07
  • %Y 四位数的年份 2007
1
2
3
4
myformat="%m/%d/%y"
leadership$date<-as.Date(leadership$date,myformat)#此处确保myformat形式与date形式相同
Sys.Date()#获取当前日期
date()#获取当前日期与时间

(2)输出为特定格式的日期

1
2
3
4
5
6
7
8
9
10
11
12
today<-Sys.Date()
format(today, format="%B%d%Y")
format(today, format="%A")
#两个日期之间可以进行算术运算:
startdate <- as.Date("2004-02-13")
enddate <- as.Date("2011-01-22")
days <- enddate-startdate
#也可以使用difftime计算时间间隔,以星期,天,时,分,秒表示
#("auto", "secs", "mins", "hours", "days", "weeks")
startdate <- as.Date("2004-02-13")
enddate <- as.Date("2011-01-22")
difftime(startdate,enddate,units="weeks")

(3)日期转换为字符型变量
strDates <- as.character(dates)

(4)更近一步

1
2
3
4
help(as.Date)
help(strftime)
help(ISOdatetime)
#两个包:lubridate,fCalendar,包含大量日期处理函数

6、类型判断

判 断 转 换
is.numeric() as.numeric()
is.character() as.character()
is.vector() as.vector()
is.matrix() as.matrix()
is.data.frame() as.data.frame()
is.factor() as.factor()
is.logical() as.logical()

7、数据排序

1
2
3
4
5
6
7
8
9
10
11
12
attach(leadership)
#排序后的数据重新赋值,按照性别年龄排序,默认为升序,排序字段前加’-’为降序
newdata=leadership[order(gender,age),]
#降序方式 newdata=leadership[order(gender,-age),]
> newdata
manager date country gender age q1 q2 q3 q4 q5
3 3 10/1/08 UK F 25 3 5 5 5 2
2 2 10/28/08 US F 45 3 5 2 5 5
5 5 5/1/09 UK F 99 2 2 1 2 1
1 1 10/24/08 US M 32 5 4 5 5 5
4 4 10/12/08 UK M 39 3 3 4 NA NA
detach(leadership)

8、数据集合并

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
> #增加列
> newdata
manager date country gender age q1 q2 q3 q4 q5
3 3 10/1/08 UK F 25 3 5 5 5 2
2 2 10/28/08 US F 45 3 5 2 5 5
5 5 5/1/09 UK F 99 2 2 1 2 1
1 1 10/24/08 US M 32 5 4 5 5 5
4 4 10/12/08 UK M 39 3 3 4 NA NA
> newcol=data.frame(meta=c(11,12,13,14,15),manager=c(1,2,3,4,5),country=c("US","US","US","US","US"))
> newcol
meta manager country
1 11 1 US
2 12 2 US
3 13 3 US
4 14 4 US
5 15 5 US
> #按照by=中的列合并数据框,结果为inner join,取交集
> total=merge(newdata,newcol,by=c("manager","country"))
> total
manager country date gender age q1 q2 q3 q4 q5 meta
1 1 US 10/24/08 M 32 5 4 5 5 5 11
2 2 US 10/28/08 F 45 3 5 2 5 5 12
> #直接合并不进行列字段匹配,需要行数一致
> total=merge(newdata,newcol,by=c("manager"))
> total
manager date country.x gender age q1 q2 q3 q4 q5 meta country.y
1 1 10/24/08 US M 32 5 4 5 5 5 11 US
2 2 10/28/08 US F 45 3 5 2 5 5 12 US
3 3 10/1/08 UK F 25 3 5 5 5 2 13 US
4 4 10/12/08 UK M 39 3 3 4 NA NA 14 US
5 5 5/1/09 UK F 99 2 2 1 2 1 15 US
> total=cbind(total,newcol)
> total
manager date country.x gender age q1 q2 q3 q4 q5 meta country.y meta manager country
1 1 10/24/08 US M 32 5 4 5 5 5 11 US 11 1 US
2 2 10/28/08 US F 45 3 5 2 5 5 12 US 12 2 US
3 3 10/1/08 UK F 25 3 5 5 5 2 13 US 13 3 US
4 4 10/12/08 UK M 39 3 3 4 NA NA 14 US 14 4 US
5 5 5/1/09 UK F 99 2 2 1 2 1 15 US 15 5 US
> #追加行,顺序不需要一致,单变量必须相同,如变量不同,需平衡变量(删除多余变量,补充变量为NA)使得列一致
> total=rbind(newdata,newdata)
> total
manager date country gender age q1 q2 q3 q4 q5
3 3 10/1/08 UK F 25 3 5 5 5 2
2 2 10/28/08 US F 45 3 5 2 5 5
5 5 5/1/09 UK F 99 2 2 1 2 1
1 1 10/24/08 US M 32 5 4 5 5 5
4 4 10/12/08 UK M 39 3 3 4 NA NA
31 3 10/1/08 UK F 25 3 5 5 5 2
21 2 10/28/08 US F 45 3 5 2 5 5
51 5 5/1/09 UK F 99 2 2 1 2 1
11 1 10/24/08 US M 32 5 4 5 5 5
41 4 10/12/08 UK M 39 3 3 4 NA NA

9、数据集取子集

(1)选入(保留)变量

1
2
3
dataframe[row indices, column indices]
#行标记选择空表示所有行
newdata=leadership[,c(6:10)]

(2)剔除变量

1
2
3
4
5
6
7
#方式1:
myvars=names(leadership) %in% c("q3","q4")#形成一个布尔数组
newdata=leadership[!myvars]#只保留布尔数组中为TRUE的列
#方式2:
newdata=leadership[c(-8,-9)]#需要知道序号
#方式3:
newdata$gender=newdata$age=NULL #直接删除某几列

(3)选择行

1
2
3
4
5
6
7
8
9
10
11
12
13
dataframe[1:3,]
#条件选择
leadership[which(leadership$gender=="M" & leadership$age > 30)]
attach(leadership)
leadership[which(gender=="M" & age > 30)]
detach(leadership)
#实例:
leadership$date=as.Date(leadership$date,"%m/%d/%y")
startdate=as.Date("2009-01-01")
enddate=as.Date("2009-10-31")
newdata=leadership[which(leadership$date >= startdate & leadership$date <= enddate),]

(4)subset()函数

1
2
newdata<- subset(leadership, age >= 35| age<24,select = c(q1,q2,q3,q4))
newdata<- subset(leadership, gender=="M" & age>25, select=gender:q4)

(5)随机抽样
sample(抽取的母集合,抽取数量,是否放回抽样)

1
mysample <- leadership[sample(1:nrow(leadership),3,replace=FALSE),]

10、SQL语句操作数据框

install.packages("sqldf")

1
2
newdf <- sqldf("select AVG(mpg),am from mtcars where carb=1 group by am",row.names=TRUE)
#row.names=TRUE表示是否沿用原来的行名称
文章目录
  1. 基本数据管理
    1. 1、创建新变量
    2. 2、变量重编码
    3. 3、变量的重命名
    4. 4、缺失值处理
    5. 5、日期值
    6. 6、类型判断
    7. 7、数据排序
    8. 8、数据集合并
    9. 9、数据集取子集
    10. 10、SQL语句操作数据框