• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

R语言学习笔记(4)

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

第四章:基本数据管理

一 贯穿整章的示例

二 变量的创建、重编码和重命名

三 日期值与缺失值

四 数据类型和类型转换

五 数据集的排序、合并与取子集

 

一 贯穿整章的示例(leadership) 

 代码4-1 
1
> manager<-c(1,2,3,4,5) 2 > date<-c("10/24/08","10/28/08","10/1/08","10/12/08","5/1/09") 3 > country<-c("us","us","uk","uk","uk") 4 > gender<-c("m","f","f","m","f") 5 > age<-c(32,45,25,39,99) 6 > q1<-c(5,3,3,3,2) 7 > q2<-c(4,5,5,3,2) 8 > q3<-c(5,2,5,4,1) 9 > q4<-c(5,5,5,NA,2) 10 > q5<-c(5,5,2,NA,1) 11 > leadership<-data.frame(manager,date,country,gender,age, 12 + q1,q2,q3,q4,q5,stringsAsFactors = FALSE) 13 > leadership 14 manager date country gender age q1 q2 q3 q4 q5 15 1 1 10/24/08 us m 32 5 4 5 5 5 16 2 2 10/28/08 us f 45 3 5 2 5 5 17 3 3 10/1/08 uk f 25 3 5 5 5 2 18 4 4 10/12/08 uk m 39 3 3 4 NA NA 19 5 5 5/1/09 uk f 99 2 2 1 2 1

 二 变量的创建、重编码与重命名

变量的创建

假设有一个数据框mydata,其中有两变量x1和x2,现想创建一个新变量sumx存储这两变量的和,并创建一个新变量meanx存储这两变量的均值,若使用下面代码中的1与2会出错,原因是R不知道x1和x2是来自数据框data,而应用代码3和4


1
>sum<-x1+x2 2 >meanx<-(x1+x2)/2

3 > meanx<-(mydata$x1+mydata$x2) #这样得到的是独立的变量 4 >meanx<-(mydata$x1+mydata$x2)/2

 

创建新变量
代码4-2
方法一:
1
> mydata<-data.frame(x1<-c(2,2,6,4), 2 + x2<-c(3,4,2,8)) 3 > sumx<-mydata$x1+mydata$x2 4 > meanx<-(mydata$x1+mydata$x2)/2 5 > sumx 6 [1] 5 6 8 12 7 > meanx 8 [1] 2.5 3.0 4.0 6.0
方法二:
1
> attach(mydata) 2 > mydata$sumx<-x1+x2 3 > mydata$meanx<-(x1+x2)/2 4 > mydata$sumx 5 [1] 5 6 8 12 6 > mydata$meanx 7 [1] 2.5 3.0 4.0 6.0
方法三
1
>mydata<-transform(mydata, 2 sumx<-x1+x2, 3 meanx<-(x1+x2)/2)

变量重编码

逻辑运算

小于(<)     小于或等于(<=)    大于(>)         大于或等于(>=)      严格等于(==)

不等于(!=)  非x  (!x)            x或y(x|y)      x和y(x&y)             测试x是否为TRUE(isTRUE(x))

 语句variable[condition] <- expression将仅在condition的值为TRUE时执行赋值
1
> leadership$agecat[leadership$age<55]<-"Young" 2 > leadership$age[leadership$age=="99"] <- NA 3 > leadership$agecat[leadership$age>75]<-"Elder" 4 > leadership$agecat[leadership$age>=55 & 5 + leadership$age<=75]<-"Middle Aged" 6 > leadership$agecat[leadership$age<55]<-"Young" 7 > leadership 8 manager date country gender age q1 q2 q3 q4 q5 agecat 9 1 1 10/24/08 us m 32 5 4 5 5 5 Young 10 2 2 10/28/08 us f 45 3 5 2 5 5 Young 11 3 3 10/1/08 uk f 25 3 5 5 5 2 Young 12 4 4 10/12/08 uk m 39 3 3 4 NA NA Young 13 5 5 5/1/09 uk f NA 2 2 1 2 1 <NA>
 1 > leadership<-within(leadership,{  
 2 +                   agecat<-NA  # 每句后面不能有逗号
 3 +                   agecat[age>75]            <-"Elder"
 4 +                   agecat[age>=55 & age <=75]<-"Middle Aged"
 5 +                   agecat[age<55]            <-"Young"})
 6 > leadership
 7   manager     date country gender age q1 q2 q3 q4 q5 agecat
 8 1       1 10/24/08      us      m  32  5  4  5  5  5  Young
 9 2       2 10/28/08      us      f  45  3  5  2  5  5  Young
10 3       3  10/1/08      uk      f  25  3  5  5  5  2  Young
11 4       4 10/12/08      uk      m  39  3  3  4 NA NA  Young
12 5       5   5/1/09      uk      f  99  2  2  1  2  1  Elder

 函数within和函数with类似,不同的是它允许你修改数据框

 变量重命名

方法一:fix(leadership)

方法二:rename(dataframe,c(oldname=“newname”,oldname=“newname”,....)

方法三:names()

法一: 
1
> leaderhip 2 manager date country gender age q1 q2 q3 q4 q5 3 1 5 10/24/08 us m 32 5 4 5 5 5 4 2 4 10/28/08 us f 45 3 5 2 5 5 5 3 3 10/1/08 uk f 25 3 5 5 5 2 6 4 2 10/12/08 uk m 39 3 3 4 NA NA 7 5 1 5/1/09 uk f 99 2 2 1 2 1 8 > fix(leaderhip) # 注意括号是英文括号,不是中文括号 9 > leaderhip 10 managerID date country gender age q1 q2 q3 q4 q5 11 1 1 10/24/08 us m 32 5 4 5 5 5 12 2 2 10/28/08 us f 45 3 5 2 5 5 13 3 3 10/1/08 uk f 25 3 5 5 5 2 14 4 4 10/12/08 uk m 39 3 3 4 NA NA 15 5 5 5/1/09 uk f 99 2 2 1 2 1
法二: 
1
> leaderhip<-rename(leaderhip, 2 + c(managerID="manager",date="testDate")) 3 > leaderhip 4 manager testDate country gender age q1 q2 q3 q4 q5 5 1 1 10/24/08 us m 32 5 4 5 5 5 6 2 2 10/28/08 us f 45 3 5 2 5 5 7 3 3 10/1/08 uk f 25 3 5 5 5 2 8 4 4 10/12/08 uk m 39 3 3 4 NA NA 9 5 5 5/1/09 uk f 99 2 2 1 2 1
法三: 
1
> names(leaderhip) 2 [1] "manager" "testDate" "country" "gender" "age" "q1" 3 [7] "q2" "q3" "q4" "q5" 4 > names(leaderhip)[1]<-"managerID" 5 > leaderhip 6 managerID testDate country gender age q1 q2 q3 q4 q5 7 1 1 10/24/08 us m 32 5 4 5 5 5 8 2 2 10/28/08 us f 45 3 5 2 5 5 9 3 3 10/1/08 uk f 25 3 5 5 5 2 10 4 4 10/12/08 uk m 39 3 3 4 NA NA 11 5 5 5/1/09 uk f 99 2 2 1 2 1

三 日期值与缺失值

日期值

日期通常以字符串的形式输入到R中,然后转化为数值形式存储的日期变量,函数as.Date()用于执行这种转化,其语法为as.Date(x, "input_format"),其中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

默认的日期格式为yyyy-mm-dd,语句为:

1 >mydates<-as.Date(c("2015-09-24","2015-09-25"))
2 >mydates 
3 [1] "2015-09-24" "2015-09-25

 

格式转化
1
>strDates<-c("24/09/2015","25/09/2015") 2 >dates<-as.Date(strDates,"%d/%m/%Y")# 注意 输入的日期转化为对应的日期,其次这里的Y是大写的,
如果这里y小写的话,会出现输出结果时间不对。
注意要加斜杠
3 >dates 4 [1] "2015-09-24" "2015-09-25"

 

 例子:
1
>leadership 2 > manager date country gender age q1 q2 q3 q4 q5 3 1 10/24/08 us m 32 5 4 5 5 5 4 2 10/28/08 us f 45 3 5 2 5 5 5 3 10/1/08 uk f 25 3 5 5 5 2 6 4 10/12/08 uk m 39 3 3 4 NA NA 7 5 5/1/09 uk f 99 2 2 1 2 1 8 >leadership$date 9 [1] "10/24/08" "10/28/08" "10/1/08" "10/12/08" "5/1/09" 10 >myformat<-"%m/%d/%y" 11 >leadership$date<-as.Date(leadership$date,myformat)# 为什么这个格式不用加斜杠也行,而上面那个要加 斜杠 12 >leadership 13 manager date country gender age q1 q2 q3 q4 q5 14 1 2008-10-24 us m 32 5 4 5 5 5 15 2 2008-10-28 us f 45 3 5 2 5 5 16 3 2008-10-01 uk f 25 3 5 5 5 2 17 4 2008-10-12 uk m 39 3 3 4 NA NA 18 5 2009-05-01 uk f 99 2 2 1 2 1

 

当前日期
Sys.Date()--返回今天的日期
date()--返回当前日期和时间
1
>Sys.Date() 2 [1] "2015-09-23" 3 >date() # 他人:这种方法返回的是字符串类型 4 [1] "Wed Sep 23 22:55:26 2015" 5 >today<-Sys.Date() 6 >format(today,format="%B %d %Y") # 格式化当前日期 7 [1] "九月 24 2015" 8 >format(today,format="%A") 9 [1] "星期四"

 

两日期相减
1
>startdate<-as.Date("2014-09-24") 2 >enddate<-as.Date("2015-09-24") 3 >days<-enddate-startdate 4 >days 5 Time difference of 365 days

 

difftime()来计算时间间隔,并以星期(weeks),天(days),时(hours),分(minutes),秒(seconds)来表示。
1
> today<-Sys.Date() 2 > wujiadong<-as.Date("1991-10-07") 3 > difftime(today,wujiadong,units = "weeks") 4 Time difference of 1250.429 weeks

此外:利用函数 strDates<-character(date) 可已经两日期变量转成成字符型变量.

       help(as.Date) and help(strftime)查看与日期和时间相关的函数

       相关包:lubridate 

缺失值

1 识别缺失值is.na()
1
> y<-c(1,2,3,NA) 2 > is.na(y) 3 [1] FALSE FALSE FALSE TRUE
代码4-3
1
> is.na(leaderhip[,6:10]) 2 q1 q2 q3 q4 q5 3 1 FALSE FALSE FALSE FALSE FALSE 4 2 FALSE FALSE FALSE FALSE FALSE 5 3 FALSE FALSE FALSE FALSE FALSE 6 4 FALSE FALSE FALSE TRUE TRUE 7 5 FALSE FALSE FALSE FALSE FALSE
2 重编码某些值为缺失值
1
> leaderhip$age[leaderhip$age==99]<-NA 2 > leaderhip$age 3 [1] 32 45 25 39 NA
3 在分析中去除缺失值
1
> x<-c(1,2,NA,3) 2 > y<-x[1]+x[2]+x[3]+x[4] 3 > sumx<-y 4 > sumx 5 [1] NA#因有缺失值 6 > x<-c(1,2,NA,3) 7 > y<-sum(x,na.rm=TRUE)#去除x中的缺失值

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
R语言绘图:在地图上绘制热力图发布时间:2022-07-18
下一篇:
R语言简单作图发布时间:2022-07-18
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap