R语言统计课件(10.21更新)-经管之家官网!

人大经济论坛-经管之家 收藏本站
您当前的位置> 软件培训>>

R语言培训

>>

R语言统计课件(10.21更新)

R语言统计课件(10.21更新)

发布:xkdog | 分类:R语言培训

关于本站

人大经济论坛-经管之家:分享大学、考研、论文、会计、留学、数据、经济学、金融学、管理学、统计学、博弈论、统计年鉴、行业分析包括等相关资源。
经管之家是国内活跃的在线教育咨询平台!

经管之家新媒体交易平台

提供"微信号、微博、抖音、快手、头条、小红书、百家号、企鹅号、UC号、一点资讯"等虚拟账号交易,真正实现买卖双方的共赢。【请点击这里访问】

提供微信号、微博、抖音、快手、头条、小红书、百家号、企鹅号、UC号、一点资讯等虚拟账号交易,真正实现买卖双方的共赢。【请点击这里访问】

请大家别忘了最后的习题!Lec03DataManagement基本数据管理========================================================本章对应《R语言实战》第4章、以及第5章的部分内容。##4.1数据框示例表4-1领导行为的性别差异经 ...
免费学术公开课,扫码加入


请大家别忘了最后的习题!
  1. Lec03Data Management 基本数据管理
  2. ========================================================
  3. 本章对应《R语言实战》第4章、以及第5章的部分内容。


  4. ## 4.1数据框示例

  5. 表4-1领导行为的性别差异

  6. 经理 | 日期 |国籍 | 性别 | 年龄 |q1|q2|q3|q4| q5
  7. -----|----------|-------|------| ---- |------|------|------|------|----
  8. 1 | 10/24/08 |US | M | 32 | 5 | 4 | 5 | 5 | 5
  9. 2 | 10/28/08 |US | F | 45 | 3 | 5 | 2 | 5 | 5
  10. 3 | 10/01/08 |UK | F | 25 | 3 | 5 | 5 | 5 | 2
  11. 4 | 10/12/08 |UK | M | 39 | 3 | 3 | 4 | |
  12. 5 | 05/01/08 |UK | F | 99 | 2 | 2 | 1 | 2 | 1

  13. 其中,q1至q5是表示经理的服从程度的5个选项上的打分,分数越高,服从性越强。空白表示数据缺失。


  14. ```{r data leadership}
  15. manager<-c(1,2,3,4,5)
  16. date<- c("10/24/08","10/28/08","10/1/08","10/12/08","5/1/09")
  17. country<-c("US","US","UK","UK","UK")
  18. gender<-c("M","F","F","M","F")
  19. age<-c(32,45,25,39,99)
  20. q1<-c(5,3,3,3,2)
  21. q2<-c(4,5,5,3,2)
  22. q3<-c(4,2,5,4,1)
  23. q4<-c(5,5,5,NA,2)
  24. q5<-c(5,5,2,NA,1)
  25. leadership<-data.frame(manager,date,country,gender,age,q1,q2,q3,q4,q5, stringsAsFactors=FALSE)
  26. # leadership
  27. ```

  28. 需要解决的问题:

  29. 1. 5个评分需要总合起来,形成一个平均服从程度的得分;
  30. 2. 缺失值的处理和某些特定编码值的处理;
  31. 3. 创建只包含感兴趣变量的数据集;
  32. 4. 将年龄重新分组;
  33. 5. 将研究范围局限在某个时段上,提取该固定时间段内的数据
  34. 6. ……

  35. ##4.2 创建新变量

  36. 表4.2算术运算符

  37. 运算符 |描述
  38. -------|-----------
  39. `+` |加
  40. `-` |减
  41. `*` |乘
  42. `/` | 除
  43. `^(or **)` | 乘方
  44. `x%%y` |求x/y的余数
  45. `x%/%y` |整数除法



  46. ```{r}
  47. leadership<-transform(leadership,
  48. sumx=q1+q2+q3+q4+q5,
  49. meanx=(q1+q2+q3+q4+q5)/5
  50. )
  51. leadership
  52. ```

  53. ## 4.3变量的重编码

  54. 如何根据已有变量的现有值创建新的值,如:

  55. 1. 将一个连续型变量修改为二分变量(虚拟变量);
  56. 2. 将一个连续型变量修改为一组定序(或定类)变量;
  57. 3. 将误编码的值修改为正确值;
  58. 4. 等等

  59. 这需要使用一系列的逻辑运算符,主要如下表所示

  60. 表4-3逻辑运算符

  61. 运算符 |描述
  62. ----------|-----------
  63. < | 小于
  64. <= | 小于等于
  65. \> | 大于
  66. \>= | 大于等于
  67. == | 严格等于
  68. != | 不等于
  69. !x | 非x
  70. x \| y | x 或 y
  71. x & y | x 和 y
  72. isTRUE(x) | 检测x是否为真


  73. 现将leadership数据框中的年龄变量改造成定序变量“年龄类别”(agecat, 分为young, midaged, elder三个区间)。

  74. 第一步,需要将99岁的年龄值转换为缺失值。
  75. ```{r}
  76. leadership$age[leadership$age==99]<-NA
  77. ```
  78. 语句`variable[condition]<-`仅在condtion的值为真时执行赋值。使用leadership$age的形式,是为保证使用的age变量来自数据框leadership。

  79. 接着
  80. ```{r}
  81. leadership$agecat[leadership$age>=75]<-"edler"
  82. leadership$agecat[leadership$age>=55 & leadership$age<75]<-"midaged"
  83. leadership$agecat[leadership$age<55]<-"young"
  84. leadership
  85. ```

  86. 这里使用了leadership$agecat的形式,是为了保证新的赋值能够存储到数据框中。

  87. 上述过程可以用within()函数写成更紧凑的形式,它与with()的作用类似,但我们可以在within()中修改数据框,而with()则不能:
  88. ```{r}
  89. leadership<-within(leadership, {
  90. agecat1<-NA
  91. agecat1[age>=75]<- "elder"
  92. agecat1[age>=55 & age<75] <- "midaged"
  93. agecat1[age<55]<-"young"
  94. })
  95. leadership
  96. ```
  97. 上面的命令执行后,"elder"、"midaged"和"young"还只是普通的字符型变量,但从统计上它们构成了一组定序变量、即R里称的“因子”。下面的命令可以将它们转为因子:
  98. ```{r}
  99. leadership$agecat<-factor(leadership$agecat,
  100. ordered=T,
  101. levels=c("young","midaged","elder"),
  102. labels=c("1","2","3"))
  103. leadership
  104. ```

  105. 另外,R中的cut()函数也可以做到将连续型变量转为因子(定类或定序)变量。
  106. ```{r}
  107. within(leadership,{
  108. agecat2<-cut(age,breaks=c(18,45,60,100),right=T,
  109. labels=c("young","midaged","elder"))
  110. })
  111. ```
  112. 其中,breaks=指定了分界点,如果分界点为`=c(a, b, c, d)`,则数据将被分为如下3组,$(a, b], (b, c], (c, d]$。如果要指定最小值在本组之内,需要增加选项`right=F`; `labels`指定了分组之后的名称。注意,使用`cut()`函数后,R自动给出一个有序因子。

  113. ##4.4变量的重命名

  114. 有两种方式可以修改变量的命名。

  115. 第一,弹窗式。
  116. ```{r}
  117. # fix(leadership)
  118. ```
  119. 第二,编程式,通常有两种方式。

  120. 首先,使用reshape包中的rename函数,其格式为`rename(dataframe, c(oldname1="newname",oldname2="newname2",…)`。
  121. ```{r}
  122. library(reshape)
  123. leadership2<-leadership
  124. leadership2<-rename(leadership2,
  125. c(manager="ID",date="testdate"))
  126. leadership2
  127. ```

  128. 其次,利用R自带的names()函数重命名变量。
  129. ```{r}
  130. leadership3<-leadership
  131. names(leadership3)
  132. names(leadership3)[2]<-"testdate"
  133. leadership3
  134. ```
  135. 类似地,可以用`names(leadership3)[1:5]<-c("name1","name2",…, "name5")`来一次性地重命名多个变量(第1至5个)。

  136. ## 4.5 缺失值

  137. 在R中,缺失值以`NA`(Not Available)表示,不可能出现的值用`NaN`(Not a Number)显示。函数`is.na()`可以用来判定是否存在缺失值。
  138. ```{r}
  139. x<-c(1,2,3,NA)
  140. is.na(x)
  141. ```
  142. 结果将返回`FALSE FALSE FALSETRUE`,即是缺失值的为`TRUE`,非缺失值的为`FALSE`。下面是另外一例。
  143. ```{r}
  144. is.na(leadership[,6:10])
  145. ```
  146. 结果返回了leadership数据框中的6:10列的缺失值情况。

  147. 注意,缺失值是不可比较的,也就是说,使用逻辑测试`myvar==NA`的结果永远不会为`TRUE`。

  148. 如果要将某些值(如数据中某些离奇的、或故意编码的值)定义为缺失值,可以使用如下形式:
  149. ```{r}
  150. leadership$age[leadership$age==99]<-NA
  151. ```
  152. 执行此语句后,任何年龄为99的值都将修改为`NA`。

  153. 如果数据包含缺失值,那么,任何含有缺失值的算术表达式和函数的计算结果也是缺失值。了解这一点非常重要。试看此例:
  154. ```{r}
  155. x<-c(1,2,NA,1)
  156. y1<-sum(x)
  157. y1
  158. ```
  159. 通常在分析中,我们需要对缺失值数据做出单独的处理,剔除缺失值,或者使用特殊的方法填补缺失值。当缺失值相对于有效数据而言不是很多时,简单地剔除可能是最有效的方法。但如果缺失值很多、占有效样本的比例很大,就需要以一定的方式进行填补,这一方面已经有许多统计技术可供选择,并已形成了一个专门的数据处理领域。

  160. 使用`na.rm=TRUE`选项,可以在计算时剔除缺失值。
  161. ```{r}
  162. x<-c(1,2,NA,1)
  163. y2<-sum(x,na.rm=T)
  164. y2
  165. ```

  166. 使用`na.omit()`可以一次性地移除所有包含缺失值的观测(即包含缺失值的所有行)。这是一种“简单粗暴”的方法,应当谨慎应用。

  167. ```{r}
  168. leadership
  169. leadership1<-na.omit(leadership)
  170. leadership1
  171. ```

  172. ## 4.6 日期值

  173. R中日期值的默认输入格式为`yyyy-mm-dd`。
  174. ```{r}
  175. date1<-as.Date(c("2007-06-22","2003-12-23")) # 注意Date需要大写
  176. date1
  177. ```
  178. 这可以将字符型数据转换为对应日期。相反,使用`as.character()`则可以将日期值转换为字符型。
  179. ```{r}
  180. date1<-as.Date(c("2007-06-22","2003-12-23"))
  181. strdate<-as.character(date1)
  182. strdate
  183. ```

  184. 日期通常以字符型向量输入R中,然后再通过一定的方式进行转换,使用的函数是`as.Date()`,其格式为`as.Date(x, "input_format")`,其中x是字符型数据,而input_format则给出用于读入数据的适当格式,列表如下:

  185. 符号 | 含义 - |示例
  186. ---------|-------------------------------------|-----------
  187. %d | 数字表示的日期(0~31) | 01~31
  188. %a | 缩写的星期名 | Mon
  189. %A | 非缩写的星期名 | Monday
  190. %m | 月份(00~12) | 00~12
  191. %b | 缩写的月份 | Jan
  192. %B | 非缩写的月份 | January
  193. %y | 两位数年份 | 12
  194. %Y | 4位数年份 | 2012


  195. ```{r}
  196. date2<-c("02/05/1965","07/09/1975")
  197. date2
  198. date3<-as.Date(date2,"%m/%d/%Y")# 注意大小写
  199. date3
  200. date4<-as.Date(date2,"%d/%m/%Y") # 试比较此语句与上一语句结果的不同
  201. date4
  202. ```

  203. `Sys.Date()`可以返回当天的日期,而`date()`则返回当前的日期和时间。
  204. ```{r}
  205. Sys.Date() #注意大小写
  206. date()
  207. ```

  208. 另外,可以使用`format(x, format="output_format")`函数来输出指定格式的日期值,并提取日期中的某些部分。
  209. ```{r}
  210. today<-Sys.Date()
  211. today
  212. format(today,format="%B-%d-%Y")
  213. format(today,format="%B/%d/%Y")
  214. format(today,format="%d")
  215. ```

  216. R内部在存储数据时是用1970年1月1日以来的天数表示的,之前的日期表示为负数。两个日期之间可以做加减运算。
  217. ```{r}
  218. startdate<-as.Date("1999-09-05")
  219. enddate<-Sys.Date()
  220. days<-enddate-startdate
  221. days
  222. ```
  223. 使用`difftime()`函数可以用来计算时间间隔,并以星期(weeks)、天(days)、时(hours)、分(mins)、秒(secs)为单位表示。
  224. ```{r}
  225. startdate<-as.Date("1999-09-01")
  226. enddate<-Sys.Date()
  227. difftime(enddate,startdate,units="secs")
  228. ```

  229. ## 4.7 类型转换
  230. R中提供了丰富的将某一类型数据转换为其他类型数据的函数。

  231. 表4-5类型判断与转换函数

  232. 判断 | 转换
  233. -------------------------|------------------
  234. is.numeric() | as.numeric()
  235. is.character() | as.character()
  236. is.vector() | as.vector()
  237. is.matrix() | as.matrix()
  238. is.data.frame() | as.data.frame()
  239. is.factor() | as.factor()
  240. is.logical() | as.logical()

  241. 名为`is.numeric()`的函数返回`TRUE`或`FALSE`,而`as.numeric()`则将对象转换为对应的数据类型。

  242. 代码清单4-5

  243. ```{r}
  244. a<-c(1,2,3)
  245. a
  246. is.numeric(a)
  247. is.vector(a)
  248. a<-as.character(a)
  249. a
  250. is.numeric(a)
  251. is.vector(a)
  252. is.character(a)
  253. ```


  254. ## 4.8数据排序

  255. 排序使用`order()`函数,默认为升序,如果在变量前加一个减号,就表示降序。
  256. ```{r}
  257. attach(leadership)
  258. leadership1<-leadership[order(gender,age),]
  259. leadership1
  260. detach(leadership)
  261. ```
  262. 以上语句中表示将leadership按gender排序、同性别的则按年龄排序。

  263. ```{r}
  264. attach(leadership)
  265. leadership1<-leadership[order(gender,-age),]#注意负号
  266. leadership1
  267. detach(leadership)
  268. ```
  269. 以上语句表示将leadership按gender排序、同性别的则按年龄倒排序。

  270. ## 4.9 数据集的合并

  271. 横向合并两个数据框使用`merge()`函数。合并两个数据框时,通常应当有至少1个公共变量,这称为数据框之间存在内联结(inner join)。其格式如下:
  272. ```{r}
  273. # total<-merge(dataframe1,dataframe2,by="ID")
  274. ```
  275. 这里表示对两个数据框按公共变量`ID`合并。
  276. ```{r}
  277. # total<-merge(dataframe1,dataframe2,by=c("ID","Country"))
  278. ```
  279. 这表示按ID和Country进行合并。

  280. 横向合并实际上相当于往原有数据框中加入新的变量。如果只是想直接横向合并两个矩阵或数据框,且不需要建立公共变量,那么可以使用`cbind()`函数,其格式为`cbind(A,B)`,但这里的A与B需要具有相同的行数,且按相同的方式进行排序。

  281. 纵向合并两个数据框使用`rbind()`函数,格式如下:
  282. ```{r}
  283. # total<-rbind(dataframeA,dataframeB)
  284. ```
  285. 两个数据框必须拥有相同的变量,但是它们的顺序并不一定相同,R会根据变量名自动进行匹配。如果dataframeA中包括了dataframeB中没有的变量,在合并之前需要进行预处理:

  286. * 删除A中的多余变量;
  287. * 在B中新建A中有、B中没有的变量,并将其值设定为`NA`。

  288. 纵向合并数据框用于往数据框中添加新的观测,这在实际中应用比较广泛。例如大型问卷的输入通常是多人完成的,每个人建立的数据框是同类型的,但是输入了不同观测(即不同调查对象)的信息。最后研究需要加若干人分别录入的数据进行汇总,就需要用到这里的纵向合并。

  289. ## 4.10提取子数据集

  290. ### 4.10.1 选取(保留)变量(即列)
  291. 选择数据框中的变量可以使用`dataframe[行标, 列标]`的方式进行。

  292. ```{r keep or delete variables}
  293. leadership1<- leadership[,c(6:10)]
  294. leadership1
  295. ```
  296. 这选取了leadership数据框中的第6至10个变量(即q1, q2, q3, q4, q5),行标为空表示选择所有行。

  297. 这与下面语句的功能是一样的。
  298. ```{r}
  299. temp1<- c("q1","q2","q3","q4","q5")
  300. leadership2<- leadership[temp1]
  301. leadership2
  302. ```
  303. 还有下面这种方式:

  304. ```{r}
  305. temp1<-paste("q",1:5,sep="")
  306. leadership2<-leadership[temp1]
  307. leadership2
  308. ```

  309. 关于`paste()`函数的用法,可使用`help(paste)`查询。

  310. ### 4.10.2 剔除(丢弃)变量

  311. 以下语句可以删除变量q3和q4。
  312. ```{r}
  313. temp2<- names(leadership) %in% c("q3","q4")
  314. temp2
  315. leadership3<- leadership[!temp2]
  316. leadership3
  317. ```
  318. 关于上述语句的细节解释如下:

  319. 1. names(leadership)产生一个包含所有变量名的字符型向量;
  320. 2. names(leadership) %in% c("q3","q4")返回一个逻辑向量,凡是匹配了q3或q4的为真,否则为假;
  321. 3. 运算符!表示“非”,!temp2可将temp2<- names(leadership) %in% c("q3","q4")的结果反转,即转真为假、转假为真;
  322. 4. leadership[!temp2]将提出!temp2返回值为真的列,而剔除返回值为假的列,这样q3和q4就被删除了。

  323. 这种方法当然是比较麻烦的,但是适用于大规模的数据集、只知列名(即变量名)而不知这一列在整个数据集中的排序的情形。

  324. 如果知道q3和q4是数据框leadership中的第8和9个变量,那么就可以通过添加减号来删除变量。

  325. ```{r}
  326. leadership4<- leadership[c(-8,-9)]
  327. leadership4
  328. ```

  329. 此外,还可以通过设定`NULL`值的方式删除变量。

  330. ```{r}
  331. leadership$q3<-leadership$q4<-NULL
  332. ```
  333. 注意`NULL`是表示未定义值。它与`NA`(缺失值)是不同的两个概念。

  334. ### 4.10.3 选择观测(行)

  335. 通过指定行标可以选择行。
  336. ```{r}
  337. leadership5<-leadership[1:3,]
  338. leadership5
  339. leadership5<-leadership[which(leadership$gender=="M" & leadership$age>30),]
  340. leadership5
  341. ```

  342. 如果绑定了数据框,可以使上述语句更简单些。
  343. ```{r}
  344. attach(leadership)
  345. leadership6<-leadership[which(gender=="M" & age>30),]
  346. leadership6
  347. detach(leadership)
  348. ```

  349. 如果只想把leadership数据框中的观测限制于2009年1月1日至2009年10月31日之内,可以使用如下语句:
  350. ```{r}
  351. leadership$date<-as.Date(leadership$date,"%m/%d/%y")
  352. startdate<-as.Date("2009-01-01")
  353. enddate<-as.Date("2009-10-31")
  354. leadership7<-leadership[which(leadership$date>=startdate & leadership$date<=enddate),]
  355. leadership7
  356. ```

  357. ### 4.10.4 抽取子集的subset()函数

  358. 使用`subset()`是简便的抽取子数据集的方式。

  359. ```{r}
  360. # leadership8<- subset(leadership, age > 35 | age < 24, select=c(q1,q2,q3,q4))
  361. # leadership8
  362. leadership9<- subset(leadership, gender=="M" & age > 25, select=(gender: q4))
  363. leadership9
  364. leadership10<- subset(leadership,age>35)
  365. leadership10
  366. ```


  367. ### 4.10.5 随机抽样

  368. sample()函数可用于随机抽取子数据集,其基本格式为`sample(x, size, replace = FALSE, prob = NULL)`,其中x为所抽取的对象(总体),n为样本量,`replace=False`表示无放回抽样(默认),`replace=TRUE`表示有放回抽样(元素可能被重复抽中,现实调查和研究中较少使用)。


  369. ```{r}
  370. leadership11<-leadership[sample(1:nrow(leadership),3, replace=F),]
  371. leadership11
  372. ```

  373. 在上面语句中,1:nrow(leadership)表示从1到leadership中最后一行,这样就产生了由所有行向量构成的被抽选总体。

  374. 顺便说明,`sample.int()`可以用来从正整数中抽取指定个整数,其格式为`sample.int(n, size = n, replace = FALSE, prob = NULL)`。例如

  375. ```{r}
  376. sample.int(10,5)
  377. ```


  378. 其他更高级的数据选择、抽样与复杂调查数据的分析方法,可参考`sampling`和`survey`包。


  379. ## 本章作业:

  380. * 读入`cy10.dta`, `cy11.dta`这两个`Stata`格式的文件,并将两者纵向合并,保存为名为cytotal的数据框。
  381. * 仅保留id, gender, residence, major, edu, grade, g1, g2, g3这9个变量,重命名为cyshort。
  382. * 将residence重命名为hukou。
  383. * 产生一个新变量,命名为gsum,生成规则为按0.6、0.3、0.1的权重加总g1、g2、g3三个变量。
  384. * 产生一个新变量,命名为yes,生成规则为:若gsum>=3.5,则赋值为1;若gsum<3.5,则赋值为0。
  385. * 按yes变量对cyshort进行倒序排序。
复制代码
「经管之家」APP:经管人学习、答疑、交友,就上经管之家!
免流量费下载资料----在经管之家app可以下载论坛上的所有资源,并且不额外收取下载高峰期的论坛币。
涵盖所有经管领域的优秀内容----覆盖经济、管理、金融投资、计量统计、数据分析、国贸、财会等专业的学习宝库,各类资料应有尽有。
来自五湖四海的经管达人----已经有上千万的经管人来到这里,你可以找到任何学科方向、有共同话题的朋友。
经管之家(原人大经济论坛),跨越高校的围墙,带你走进经管知识的新世界。
扫描下方二维码下载并注册APP
本文关键词:

本文论坛网址:https://bbs.pinggu.org/thread-3273299-1-1.html

人气文章

1.凡人大经济论坛-经管之家转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
经管之家 人大经济论坛 大学 专业 手机版