关于本站
人大经济论坛-经管之家:分享大学、考研、论文、会计、留学、数据、经济学、金融学、管理学、统计学、博弈论、统计年鉴、行业分析包括等相关资源。
经管之家是国内活跃的在线教育咨询平台!
经管之家新媒体交易平台
提供"微信号、微博、抖音、快手、头条、小红书、百家号、企鹅号、UC号、一点资讯"等虚拟账号交易,真正实现买卖双方的共赢。【请点击这里访问】
TOP热门关键词
请大家别忘了最后的习题!Lec03DataManagement基本数据管理========================================================本章对应《R语言实战》第4章、以及第5章的部分内容。##4.1数据框示例表4-1领导行为的性别差异经 ...
免费学术公开课,扫码加入 |
- Lec03Data Management 基本数据管理
- ========================================================
- 本章对应《R语言实战》第4章、以及第5章的部分内容。
- ## 4.1数据框示例
- 表4-1领导行为的性别差异
- 经理 | 日期 |国籍 | 性别 | 年龄 |q1|q2|q3|q4| q5
- -----|----------|-------|------| ---- |------|------|------|------|----
- 1 | 10/24/08 |US | M | 32 | 5 | 4 | 5 | 5 | 5
- 2 | 10/28/08 |US | F | 45 | 3 | 5 | 2 | 5 | 5
- 3 | 10/01/08 |UK | F | 25 | 3 | 5 | 5 | 5 | 2
- 4 | 10/12/08 |UK | M | 39 | 3 | 3 | 4 | |
- 5 | 05/01/08 |UK | F | 99 | 2 | 2 | 1 | 2 | 1
- 其中,q1至q5是表示经理的服从程度的5个选项上的打分,分数越高,服从性越强。空白表示数据缺失。
- ```{r data leadership}
- 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(4,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
- ```
- 需要解决的问题:
- 1. 5个评分需要总合起来,形成一个平均服从程度的得分;
- 2. 缺失值的处理和某些特定编码值的处理;
- 3. 创建只包含感兴趣变量的数据集;
- 4. 将年龄重新分组;
- 5. 将研究范围局限在某个时段上,提取该固定时间段内的数据
- 6. ……
- ##4.2 创建新变量
- 表4.2算术运算符
- 运算符 |描述
- -------|-----------
- `+` |加
- `-` |减
- `*` |乘
- `/` | 除
- `^(or **)` | 乘方
- `x%%y` |求x/y的余数
- `x%/%y` |整数除法
- ```{r}
- leadership<-transform(leadership,
- sumx=q1+q2+q3+q4+q5,
- meanx=(q1+q2+q3+q4+q5)/5
- )
- leadership
- ```
- ## 4.3变量的重编码
- 如何根据已有变量的现有值创建新的值,如:
- 1. 将一个连续型变量修改为二分变量(虚拟变量);
- 2. 将一个连续型变量修改为一组定序(或定类)变量;
- 3. 将误编码的值修改为正确值;
- 4. 等等
- 这需要使用一系列的逻辑运算符,主要如下表所示
- 表4-3逻辑运算符
- 运算符 |描述
- ----------|-----------
- < | 小于
- <= | 小于等于
- \> | 大于
- \>= | 大于等于
- == | 严格等于
- != | 不等于
- !x | 非x
- x \| y | x 或 y
- x & y | x 和 y
- isTRUE(x) | 检测x是否为真
- 现将leadership数据框中的年龄变量改造成定序变量“年龄类别”(agecat, 分为young, midaged, elder三个区间)。
- 第一步,需要将99岁的年龄值转换为缺失值。
- ```{r}
- leadership$age[leadership$age==99]<-NA
- ```
- 语句`variable[condition]<-`仅在condtion的值为真时执行赋值。使用leadership$age的形式,是为保证使用的age变量来自数据框leadership。
- 接着
- ```{r}
- leadership$agecat[leadership$age>=75]<-"edler"
- leadership$agecat[leadership$age>=55 & leadership$age<75]<-"midaged"
- leadership$agecat[leadership$age<55]<-"young"
- leadership
- ```
- 这里使用了leadership$agecat的形式,是为了保证新的赋值能够存储到数据框中。
- 上述过程可以用within()函数写成更紧凑的形式,它与with()的作用类似,但我们可以在within()中修改数据框,而with()则不能:
- ```{r}
- leadership<-within(leadership, {
- agecat1<-NA
- agecat1[age>=75]<- "elder"
- agecat1[age>=55 & age<75] <- "midaged"
- agecat1[age<55]<-"young"
- })
- leadership
- ```
- 上面的命令执行后,"elder"、"midaged"和"young"还只是普通的字符型变量,但从统计上它们构成了一组定序变量、即R里称的“因子”。下面的命令可以将它们转为因子:
- ```{r}
- leadership$agecat<-factor(leadership$agecat,
- ordered=T,
- levels=c("young","midaged","elder"),
- labels=c("1","2","3"))
- leadership
- ```
- 另外,R中的cut()函数也可以做到将连续型变量转为因子(定类或定序)变量。
- ```{r}
- within(leadership,{
- agecat2<-cut(age,breaks=c(18,45,60,100),right=T,
- labels=c("young","midaged","elder"))
- })
- ```
- 其中,breaks=指定了分界点,如果分界点为`=c(a, b, c, d)`,则数据将被分为如下3组,$(a, b], (b, c], (c, d]$。如果要指定最小值在本组之内,需要增加选项`right=F`; `labels`指定了分组之后的名称。注意,使用`cut()`函数后,R自动给出一个有序因子。
- ##4.4变量的重命名
- 有两种方式可以修改变量的命名。
- 第一,弹窗式。
- ```{r}
- # fix(leadership)
- ```
- 第二,编程式,通常有两种方式。
- 首先,使用reshape包中的rename函数,其格式为`rename(dataframe, c(oldname1="newname",oldname2="newname2",…)`。
- ```{r}
- library(reshape)
- leadership2<-leadership
- leadership2<-rename(leadership2,
- c(manager="ID",date="testdate"))
- leadership2
- ```
- 其次,利用R自带的names()函数重命名变量。
- ```{r}
- leadership3<-leadership
- names(leadership3)
- names(leadership3)[2]<-"testdate"
- leadership3
- ```
- 类似地,可以用`names(leadership3)[1:5]<-c("name1","name2",…, "name5")`来一次性地重命名多个变量(第1至5个)。
- ## 4.5 缺失值
- 在R中,缺失值以`NA`(Not Available)表示,不可能出现的值用`NaN`(Not a Number)显示。函数`is.na()`可以用来判定是否存在缺失值。
- ```{r}
- x<-c(1,2,3,NA)
- is.na(x)
- ```
- 结果将返回`FALSE FALSE FALSETRUE`,即是缺失值的为`TRUE`,非缺失值的为`FALSE`。下面是另外一例。
- ```{r}
- is.na(leadership[,6:10])
- ```
- 结果返回了leadership数据框中的6:10列的缺失值情况。
- 注意,缺失值是不可比较的,也就是说,使用逻辑测试`myvar==NA`的结果永远不会为`TRUE`。
- 如果要将某些值(如数据中某些离奇的、或故意编码的值)定义为缺失值,可以使用如下形式:
- ```{r}
- leadership$age[leadership$age==99]<-NA
- ```
- 执行此语句后,任何年龄为99的值都将修改为`NA`。
- 如果数据包含缺失值,那么,任何含有缺失值的算术表达式和函数的计算结果也是缺失值。了解这一点非常重要。试看此例:
- ```{r}
- x<-c(1,2,NA,1)
- y1<-sum(x)
- y1
- ```
- 通常在分析中,我们需要对缺失值数据做出单独的处理,剔除缺失值,或者使用特殊的方法填补缺失值。当缺失值相对于有效数据而言不是很多时,简单地剔除可能是最有效的方法。但如果缺失值很多、占有效样本的比例很大,就需要以一定的方式进行填补,这一方面已经有许多统计技术可供选择,并已形成了一个专门的数据处理领域。
- 使用`na.rm=TRUE`选项,可以在计算时剔除缺失值。
- ```{r}
- x<-c(1,2,NA,1)
- y2<-sum(x,na.rm=T)
- y2
- ```
- 使用`na.omit()`可以一次性地移除所有包含缺失值的观测(即包含缺失值的所有行)。这是一种“简单粗暴”的方法,应当谨慎应用。
- ```{r}
- leadership
- leadership1<-na.omit(leadership)
- leadership1
- ```
- ## 4.6 日期值
- R中日期值的默认输入格式为`yyyy-mm-dd`。
- ```{r}
- date1<-as.Date(c("2007-06-22","2003-12-23")) # 注意Date需要大写
- date1
- ```
- 这可以将字符型数据转换为对应日期。相反,使用`as.character()`则可以将日期值转换为字符型。
- ```{r}
- date1<-as.Date(c("2007-06-22","2003-12-23"))
- strdate<-as.character(date1)
- strdate
- ```
- 日期通常以字符型向量输入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 | 两位数年份 | 12
- %Y | 4位数年份 | 2012
- ```{r}
- date2<-c("02/05/1965","07/09/1975")
- date2
- date3<-as.Date(date2,"%m/%d/%Y")# 注意大小写
- date3
- date4<-as.Date(date2,"%d/%m/%Y") # 试比较此语句与上一语句结果的不同
- date4
- ```
- `Sys.Date()`可以返回当天的日期,而`date()`则返回当前的日期和时间。
- ```{r}
- Sys.Date() #注意大小写
- date()
- ```
- 另外,可以使用`format(x, format="output_format")`函数来输出指定格式的日期值,并提取日期中的某些部分。
- ```{r}
- today<-Sys.Date()
- today
- format(today,format="%B-%d-%Y")
- format(today,format="%B/%d/%Y")
- format(today,format="%d")
- ```
- R内部在存储数据时是用1970年1月1日以来的天数表示的,之前的日期表示为负数。两个日期之间可以做加减运算。
- ```{r}
- startdate<-as.Date("1999-09-05")
- enddate<-Sys.Date()
- days<-enddate-startdate
- days
- ```
- 使用`difftime()`函数可以用来计算时间间隔,并以星期(weeks)、天(days)、时(hours)、分(mins)、秒(secs)为单位表示。
- ```{r}
- startdate<-as.Date("1999-09-01")
- enddate<-Sys.Date()
- difftime(enddate,startdate,units="secs")
- ```
- ## 4.7 类型转换
- R中提供了丰富的将某一类型数据转换为其他类型数据的函数。
- 表4-5类型判断与转换函数
- 判断 | 转换
- -------------------------|------------------
- 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()
- 名为`is.numeric()`的函数返回`TRUE`或`FALSE`,而`as.numeric()`则将对象转换为对应的数据类型。
- 代码清单4-5
- ```{r}
- a<-c(1,2,3)
- a
- is.numeric(a)
- is.vector(a)
- a<-as.character(a)
- a
- is.numeric(a)
- is.vector(a)
- is.character(a)
- ```
- ## 4.8数据排序
- 排序使用`order()`函数,默认为升序,如果在变量前加一个减号,就表示降序。
- ```{r}
- attach(leadership)
- leadership1<-leadership[order(gender,age),]
- leadership1
- detach(leadership)
- ```
- 以上语句中表示将leadership按gender排序、同性别的则按年龄排序。
- ```{r}
- attach(leadership)
- leadership1<-leadership[order(gender,-age),]#注意负号
- leadership1
- detach(leadership)
- ```
- 以上语句表示将leadership按gender排序、同性别的则按年龄倒排序。
- ## 4.9 数据集的合并
- 横向合并两个数据框使用`merge()`函数。合并两个数据框时,通常应当有至少1个公共变量,这称为数据框之间存在内联结(inner join)。其格式如下:
- ```{r}
- # total<-merge(dataframe1,dataframe2,by="ID")
- ```
- 这里表示对两个数据框按公共变量`ID`合并。
- ```{r}
- # total<-merge(dataframe1,dataframe2,by=c("ID","Country"))
- ```
- 这表示按ID和Country进行合并。
- 横向合并实际上相当于往原有数据框中加入新的变量。如果只是想直接横向合并两个矩阵或数据框,且不需要建立公共变量,那么可以使用`cbind()`函数,其格式为`cbind(A,B)`,但这里的A与B需要具有相同的行数,且按相同的方式进行排序。
- 纵向合并两个数据框使用`rbind()`函数,格式如下:
- ```{r}
- # total<-rbind(dataframeA,dataframeB)
- ```
- 两个数据框必须拥有相同的变量,但是它们的顺序并不一定相同,R会根据变量名自动进行匹配。如果dataframeA中包括了dataframeB中没有的变量,在合并之前需要进行预处理:
- * 删除A中的多余变量;
- * 在B中新建A中有、B中没有的变量,并将其值设定为`NA`。
- 纵向合并数据框用于往数据框中添加新的观测,这在实际中应用比较广泛。例如大型问卷的输入通常是多人完成的,每个人建立的数据框是同类型的,但是输入了不同观测(即不同调查对象)的信息。最后研究需要加若干人分别录入的数据进行汇总,就需要用到这里的纵向合并。
- ## 4.10提取子数据集
- ### 4.10.1 选取(保留)变量(即列)
- 选择数据框中的变量可以使用`dataframe[行标, 列标]`的方式进行。
- ```{r keep or delete variables}
- leadership1<- leadership[,c(6:10)]
- leadership1
- ```
- 这选取了leadership数据框中的第6至10个变量(即q1, q2, q3, q4, q5),行标为空表示选择所有行。
- 这与下面语句的功能是一样的。
- ```{r}
- temp1<- c("q1","q2","q3","q4","q5")
- leadership2<- leadership[temp1]
- leadership2
- ```
- 还有下面这种方式:
- ```{r}
- temp1<-paste("q",1:5,sep="")
- leadership2<-leadership[temp1]
- leadership2
- ```
- 关于`paste()`函数的用法,可使用`help(paste)`查询。
- ### 4.10.2 剔除(丢弃)变量
- 以下语句可以删除变量q3和q4。
- ```{r}
- temp2<- names(leadership) %in% c("q3","q4")
- temp2
- leadership3<- leadership[!temp2]
- leadership3
- ```
- 关于上述语句的细节解释如下:
- 1. names(leadership)产生一个包含所有变量名的字符型向量;
- 2. names(leadership) %in% c("q3","q4")返回一个逻辑向量,凡是匹配了q3或q4的为真,否则为假;
- 3. 运算符!表示“非”,!temp2可将temp2<- names(leadership) %in% c("q3","q4")的结果反转,即转真为假、转假为真;
- 4. leadership[!temp2]将提出!temp2返回值为真的列,而剔除返回值为假的列,这样q3和q4就被删除了。
- 这种方法当然是比较麻烦的,但是适用于大规模的数据集、只知列名(即变量名)而不知这一列在整个数据集中的排序的情形。
- 如果知道q3和q4是数据框leadership中的第8和9个变量,那么就可以通过添加减号来删除变量。
- ```{r}
- leadership4<- leadership[c(-8,-9)]
- leadership4
- ```
- 此外,还可以通过设定`NULL`值的方式删除变量。
- ```{r}
- leadership$q3<-leadership$q4<-NULL
- ```
- 注意`NULL`是表示未定义值。它与`NA`(缺失值)是不同的两个概念。
- ### 4.10.3 选择观测(行)
- 通过指定行标可以选择行。
- ```{r}
- leadership5<-leadership[1:3,]
- leadership5
- leadership5<-leadership[which(leadership$gender=="M" & leadership$age>30),]
- leadership5
- ```
- 如果绑定了数据框,可以使上述语句更简单些。
- ```{r}
- attach(leadership)
- leadership6<-leadership[which(gender=="M" & age>30),]
- leadership6
- detach(leadership)
- ```
- 如果只想把leadership数据框中的观测限制于2009年1月1日至2009年10月31日之内,可以使用如下语句:
- ```{r}
- leadership$date<-as.Date(leadership$date,"%m/%d/%y")
- startdate<-as.Date("2009-01-01")
- enddate<-as.Date("2009-10-31")
- leadership7<-leadership[which(leadership$date>=startdate & leadership$date<=enddate),]
- leadership7
- ```
- ### 4.10.4 抽取子集的subset()函数
- 使用`subset()`是简便的抽取子数据集的方式。
- ```{r}
- # leadership8<- subset(leadership, age > 35 | age < 24, select=c(q1,q2,q3,q4))
- # leadership8
- leadership9<- subset(leadership, gender=="M" & age > 25, select=(gender: q4))
- leadership9
- leadership10<- subset(leadership,age>35)
- leadership10
- ```
- ### 4.10.5 随机抽样
- sample()函数可用于随机抽取子数据集,其基本格式为`sample(x, size, replace = FALSE, prob = NULL)`,其中x为所抽取的对象(总体),n为样本量,`replace=False`表示无放回抽样(默认),`replace=TRUE`表示有放回抽样(元素可能被重复抽中,现实调查和研究中较少使用)。
- ```{r}
- leadership11<-leadership[sample(1:nrow(leadership),3, replace=F),]
- leadership11
- ```
- 在上面语句中,1:nrow(leadership)表示从1到leadership中最后一行,这样就产生了由所有行向量构成的被抽选总体。
- 顺便说明,`sample.int()`可以用来从正整数中抽取指定个整数,其格式为`sample.int(n, size = n, replace = FALSE, prob = NULL)`。例如
- ```{r}
- sample.int(10,5)
- ```
- 其他更高级的数据选择、抽样与复杂调查数据的分析方法,可参考`sampling`和`survey`包。
- ## 本章作业:
- * 读入`cy10.dta`, `cy11.dta`这两个`Stata`格式的文件,并将两者纵向合并,保存为名为cytotal的数据框。
- * 仅保留id, gender, residence, major, edu, grade, g1, g2, g3这9个变量,重命名为cyshort。
- * 将residence重命名为hukou。
- * 产生一个新变量,命名为gsum,生成规则为按0.6、0.3、0.1的权重加总g1、g2、g3三个变量。
- * 产生一个新变量,命名为yes,生成规则为:若gsum>=3.5,则赋值为1;若gsum<3.5,则赋值为0。
- * 按yes变量对cyshort进行倒序排序。
「经管之家」APP:经管人学习、答疑、交友,就上经管之家!
免流量费下载资料----在经管之家app可以下载论坛上的所有资源,并且不额外收取下载高峰期的论坛币。
涵盖所有经管领域的优秀内容----覆盖经济、管理、金融投资、计量统计、数据分析、国贸、财会等专业的学习宝库,各类资料应有尽有。
来自五湖四海的经管达人----已经有上千万的经管人来到这里,你可以找到任何学科方向、有共同话题的朋友。
经管之家(原人大经济论坛),跨越高校的围墙,带你走进经管知识的新世界。
扫描下方二维码下载并注册APP
免流量费下载资料----在经管之家app可以下载论坛上的所有资源,并且不额外收取下载高峰期的论坛币。
涵盖所有经管领域的优秀内容----覆盖经济、管理、金融投资、计量统计、数据分析、国贸、财会等专业的学习宝库,各类资料应有尽有。
来自五湖四海的经管达人----已经有上千万的经管人来到这里,你可以找到任何学科方向、有共同话题的朋友。
经管之家(原人大经济论坛),跨越高校的围墙,带你走进经管知识的新世界。
扫描下方二维码下载并注册APP
您可能感兴趣的文章
人气文章
1.凡人大经济论坛-经管之家转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。