ITPub博客

首页 > > > R语言实战-第四章实践笔记

R语言实战-第四章实践笔记

作者:浪花小雨滴 时间:2020-06-16 15:30:28 0 删除 编辑

4.2创建新变量

书中给出三种方式创建新变量,同时将新变量整合到原始的数据框中,练习了一下其中两种方式:

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
mydata
mydata<-data.frame(x1=c(2,2,6,4),x2=c(3,4,2,8))
mydata<-transform(mydata,sumx=x1+x2,meanx=(x1+x2)/2)
mydata

4.3变量的重编码

用variable[condition]<-expression语句,将leadership数据集中经理人的连续型年龄变量age重编码为类别型变量agecat(Young、Middle、Elder)。

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)

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"
leadership

4.4变量的重命名

可交互地或者以编程的方式修改变量名称。

1)使用语句fix(leadership)调用交互式编辑器,修改名称即可。

2)通过names()函数来重命名变量,例如:

names(leadership)[2]<-"testDate"

4.5缺失值

函数is.na()可检测缺失值是否存在,例:

> 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)
> is.na(leadership[,6:10])
        q1    q2    q3    q4    q5
[1,] FALSE FALSE FALSE FALSE FALSE
[2,] FALSE FALSE FALSE FALSE FALSE
[3,] FALSE FALSE FALSE FALSE FALSE
[4,] FALSE FALSE FALSE  TRUE  TRUE
[5,] FALSE FALSE FALSE FALSE FALSE

4.5.1重编码某些值为缺失值

将年龄等于99的值修改位NA

leadership$age[leadership$age==99]<-NA
4.5.2在分析中排除缺失值

多数的数值函数都拥有na.rm=TRUE选项,可在计算之前移除缺失值并使用剩余值进行计算。

> x<-c(1,2,NA,3)
> y<-sum(x,na.rm = TRUE)
> y
[1] 6

函数na.omit()可移除所有含有缺失值的观测。

4.6日期值

日期值通常以字符串的形式输入到R中,然后转化为以数值形式存储的日期变量,函数as.Date()用于执行这种转化。

日期值的默认输入格式为yyyy-mm-dd,即以这种格式输入的字符串会被默认为是日期值,例:

mydate<-as.Date(c("2007-06-22","2004-02-13"))
若用其它格式输入日期值,则需要在后面写明相应的格式,以方便R来读取日期数据,例:
strDates<-c("01/05/1965","08/16/1975")
dates<-as.Date(strDates,"%m/%d%Y)        #注意Y的大小写
可使用函数format()来输出指定格式的日期值,并且可提取日期中的某些部分:
> today<-Sys.Date()
> format(today,format="%B %d %Y")
[1] "四月 02 2017"
> format(today,format="%A")
[1] "星期日"

可在日期值上执行算数运算,例如:

> startdate<-as.Date("2004-02-13")
> enddate<-as.Date("2011-01-22")
> days<-enddate-startdate
> days
Time difference of 2535 days

还可用diftime()来计算时间间隔,并以不同单位来表示,例如:

> today<-Sys.Date()
> dob<-as.Date("1956-10-12")
> difftime(today,dob,units="weeks")
Time difference of 3155.286 weeks

4.7类型转换

4.8数据排序

可使用order()函数对一个数据框进行排序,默认顺序是升序,变量前边加一个减号得到降序。

> attach(leadership)
> newdata<-leadership[order(gender,-age),]
> newdata
  manager     date country gender age q1 q2 q3 q4 q5
5       5   5/1/09      UK      F  99  2  2  1  2  1
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
1       1 10/24/08      US      M  32  5  4  5  5  5

将各行依女性到男性,同样性别众年龄按降序排序。

4.9数据集的合并

4.9.1向数据框添加列

1)横向合并两个数据框使用merge()函数,用法如下:

total<-merge(dataframeA,dataframeB,by="ID")

2)直接横向合并两个矩阵或数据框,并且不需要指定一个公共索引,可使用cbind():

total<-cbind(A,B)

4.9.2向数据框添加行

纵向合并两个数据框,使用rbind()函数:

total<-rbind(dataframeA,dataframeB)   #两个数据框需有相同变量

4.10数据集取子集

4.10.1选入(保留)变量

1).用下标来选入变量

newdata<-leadership[,c(6,10)]

2).用变量名充当下标选入变量

myvars<-c("q1","q2","q3","q4","q5")
newdata<-leadership[myvars]

3).使用paste()函数

myvars<-paste("q",1;5,sep=" ")
newdata<-leadership[myvars]

4.10.2剔除(丢弃)变量

若某个变量含有较多缺失值,想在进一步分析之前将其丢弃,可使用下面的语句:

myvars<-names(leadership)%in%c("q3","q4")    #返回逻辑型向量
newdata<-leadership[!myvars]       #逻辑反转,剔除q3,q4
若已知q3,q4是第八个和第九个变量,则可使用语句:
newdata<-leadership[c(-8,-9)]

4.10.3选入观测

> newdata<-leadership[leadership$gender=="M"&leadership$age>30,]
> newdata
  manager     date country gender age q1 q2 q3 q4 q5
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

限定时间范围:

> leadership$date<-as.Date(leadership$date,"%m/%d/%y")
> startdate<-as.Date("2009-01-01")
> enddate  <-as.Date("2009-10-31")
> newdata  <-leadership[leadership$date>startdate&leadership$date<enddate,]
> newdata
  manager       date country gender age q1 q2 q3 q4 q5
5       5 2009-05-01      UK      F  99  2  2  1  2  1

4.10.4 subset()函数

subset()函数是选择变量和观测变量最简单的方法,示例如下:

> newdata1<-subset(leadership,age>=34|age<24,select = c(q1,q2,q3,q4))
> newdata2<-subset(leadership,gender=="M"&age>24,select =gender:q4 )
> newdata1
  q1 q2 q3 q4
2  3  5  2  5
4  3  3  4 NA
5  2  2  1  2
> newdata2
  gender age q1 q2 q3 q4
1      M  32  5  4  5  5
4      M  39  3  3  4 NA

4.10.5随机抽样

sample()函数可从数据集中(又放回或无放回)抽取大小为n的一个随机样本:

> mysample<-leadership[sample(1:nrow(leadership),3,replace = FALSE),]
> mysample
  manager     date country gender age q1 q2 q3 q4 q5
2       2 10/28/08      US      F  45  3  5  2  5  5
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

sample中第一个参数"1:nrow(leadership)"是一个要从中抽样的元素组成的向量,向量是1到数据框中观测的数量,第二个参数"3"是要抽取观测的数量,第三个参数"replaced=FALSE"表示无放回抽样。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31537575/viewspace-3166711/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2018-05-16

  • 博文量
    4259
  • 访问量
    40185