加载中...

R


其中 Y=R

源代码下载: learnr-zh.r

R 是一门统计语言。它有很多数据分析和挖掘程序包。可以用来统计、分析和制图。 你也可以在 LaTeX 文档中运行 R 命令。

  1. # 评论以 # 开始
  2. # R 语言原生不支持 多行注释
  3. # 但是你可以像这样来多行注释
  4. # 在窗口里按回车键可以执行一条命令
  5. ###################################################################
  6. # 不用懂编程就可以开始动手了
  7. ###################################################################
  8. data() # 浏览内建的数据集
  9. data(rivers) # 北美主要河流的长度(数据集)
  10. ls() # 在工作空间中查看「河流」是否出现
  11. head(rivers) # 撇一眼数据集
  12. # 735 320 325 392 524 450
  13. length(rivers) # 我们测量了多少条河流?
  14. # 141
  15. summary(rivers)
  16. # Min. 1st Qu. Median Mean 3rd Qu. Max.
  17. # 135.0 310.0 425.0 591.2 680.0 3710.0
  18. stem(rivers) # 茎叶图(一种类似于直方图的展现形式)
  19. #
  20. # The decimal point is 2 digit(s) to the right of the |
  21. #
  22. # 0 | 4
  23. # 2 | 011223334555566667778888899900001111223333344455555666688888999
  24. # 4 | 111222333445566779001233344567
  25. # 6 | 000112233578012234468
  26. # 8 | 045790018
  27. # 10 | 04507
  28. # 12 | 1471
  29. # 14 | 56
  30. # 16 | 7
  31. # 18 | 9
  32. # 20 |
  33. # 22 | 25
  34. # 24 | 3
  35. # 26 |
  36. # 28 |
  37. # 30 |
  38. # 32 |
  39. # 34 |
  40. # 36 | 1
  41. stem(log(rivers)) # 查看数据集的方式既不是标准形式,也不是取log后的结果! 看起来,是钟形曲线形式的基本数据集
  42. # The decimal point is 1 digit(s) to the left of the |
  43. #
  44. # 48 | 1
  45. # 50 |
  46. # 52 | 15578
  47. # 54 | 44571222466689
  48. # 56 | 023334677000124455789
  49. # 58 | 00122366666999933445777
  50. # 60 | 122445567800133459
  51. # 62 | 112666799035
  52. # 64 | 00011334581257889
  53. # 66 | 003683579
  54. # 68 | 0019156
  55. # 70 | 079357
  56. # 72 | 89
  57. # 74 | 84
  58. # 76 | 56
  59. # 78 | 4
  60. # 80 |
  61. # 82 | 2
  62. hist(rivers, col="#333333", border="white", breaks=25) # 试试用这些参数画画 (译者注:给 river 做统计频数直方图,包含了这些参数:数据源,颜色,边框,空格)
  63. hist(log(rivers), col="#333333", border="white", breaks=25) #你还可以做更多式样的绘图
  64. # 还有其他一些简单的数据集可以被用来加载。R 语言包括了大量这种 data()
  65. data(discoveries)
  66. plot(discoveries, col="#333333", lwd=3, xlab="Year", main="Number of important discoveries per year")
  67. # 译者注:参数为(数据源,颜色,线条宽度,X 轴名称,标题)
  68. plot(discoveries, col="#333333", lwd=3, type = "h", xlab="Year", main="Number of important discoveries per year")
  69. # 除了按照默认的年份排序,我们还可以排序来发现特征
  70. sort(discoveries)
  71. # [1] 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2
  72. # [26] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3
  73. # [51] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4
  74. # [76] 4 4 4 4 5 5 5 5 5 5 5 6 6 6 6 6 6 7 7 7 7 8 9 10 12
  75. stem(discoveries, scale=2) # 译者注:茎叶图(数据,放大系数)
  76. #
  77. # The decimal point is at the |
  78. #
  79. # 0 | 000000000
  80. # 1 | 000000000000
  81. # 2 | 00000000000000000000000000
  82. # 3 | 00000000000000000000
  83. # 4 | 000000000000
  84. # 5 | 0000000
  85. # 6 | 000000
  86. # 7 | 0000
  87. # 8 | 0
  88. # 9 | 0
  89. # 10 | 0
  90. # 11 |
  91. # 12 | 0
  92. max(discoveries)
  93. # 12
  94. summary(discoveries)
  95. # Min. 1st Qu. Median Mean 3rd Qu. Max.
  96. # 0.0 2.0 3.0 3.1 4.0 12.0
  97. #基本的统计学操作也不需要任何编程知识
  98. #随机生成数据
  99. round(runif(7, min=.5, max=6.5))
  100. # 译者注:runif 产生随机数,round 四舍五入
  101. # 1 4 6 1 4 6 4
  102. # 你输出的结果会和我们给出的不同,除非我们设置了相同的随机种子 random.seed(31337)
  103. #从标准高斯函数中随机生成 9 次
  104. rnorm(9)
  105. # [1] 0.07528471 1.03499859 1.34809556 -0.82356087 0.61638975 -1.88757271
  106. # [7] -0.59975593 0.57629164 1.08455362
  107. #########################
  108. # 基础编程
  109. #########################
  110. # 数值
  111. #“数值”指的是双精度的浮点数
  112. 5 # 5
  113. class(5) # "numeric"
  114. 5e4 # 50000 # 用科学技术法方便的处理极大值、极小值或者可变的量级
  115. 6.02e23 # 阿伏伽德罗常数#
  116. 1.6e-35 # 布朗克长度
  117. # 长整数并用 L 结尾
  118. 5L # 5
  119. #输出5L
  120. class(5L) # "integer"
  121. # 可以自己试一试?用 class() 函数获取更多信息
  122. # 事实上,你可以找一些文件查阅 `xyz` 以及xyz的差别
  123. # `xyz` 用来查看源码实现,?xyz 用来看帮助
  124. # 算法
  125. 10 + 66 # 76
  126. 53.2 - 4 # 49.2
  127. 2 * 2.0 # 4
  128. 3L / 4 # 0.75
  129. 3 %% 2 # 1
  130. # 特殊数值类型
  131. class(NaN) # "numeric"
  132. class(Inf) # "numeric"
  133. class(-Inf) # "numeric" # 在以下场景中会用到 integrate( dnorm(x), 3, Inf ) -- 消除 Z 轴数据
  134. # 但要注意,NaN 并不是唯一的特殊数值类型……
  135. class(NA) # 看上面
  136. class(NULL) # NULL
  137. # 简单列表
  138. c(6, 8, 7, 5, 3, 0, 9) # 6 8 7 5 3 0 9
  139. c('alef', 'bet', 'gimmel', 'dalet', 'he')
  140. c('Z', 'o', 'r', 'o') == "Zoro" # FALSE FALSE FALSE FALSE
  141. # 一些优雅的内置功能
  142. 5:15 # 5 6 7 8 9 10 11 12 13 14 15
  143. seq(from=0, to=31337, by=1337)
  144. # [1] 0 1337 2674 4011 5348 6685 8022 9359 10696 12033 13370 14707
  145. # [13] 16044 17381 18718 20055 21392 22729 24066 25403 26740 28077 29414 30751
  146. letters
  147. # [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s"
  148. # [20] "t" "u" "v" "w" "x" "y" "z"
  149. month.abb # "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec"
  150. # Access the n'th element of a list with list.name[n] or sometimes list.name[[n]]
  151. # 使用 list.name[n] 来访问第 n 个列表元素,有时候需要使用 list.name[[n]]
  152. letters[18] # "r"
  153. LETTERS[13] # "M"
  154. month.name[9] # "September"
  155. c(6, 8, 7, 5, 3, 0, 9)[3] # 7
  156. # 字符串
  157. # 字符串和字符在 R 语言中没有区别
  158. "Horatio" # "Horatio"
  159. class("Horatio") # "character"
  160. substr("Fortuna multis dat nimis, nulli satis.", 9, 15) # "multis "
  161. gsub('u', 'ø', "Fortuna multis dat nimis, nulli satis.") # "Fortøna møltis dat nimis, nølli satis."
  162. # 逻辑值
  163. # 布尔值
  164. class(TRUE) # "logical"
  165. class(FALSE) # "logical"
  166. # 和我们预想的一样
  167. TRUE == TRUE # TRUE
  168. TRUE == FALSE # FALSE
  169. FALSE != FALSE # FALSE
  170. FALSE != TRUE # TRUE
  171. # 缺失数据(NA)也是逻辑值
  172. class(NA) # "logical"
  173. #定义NA为逻辑型
  174. # 因子
  175. # 因子是为数据分类排序设计的(像是排序小朋友们的年级或性别)
  176. levels(factor(c("female", "male", "male", "female", "NA", "female"))) # "female" "male" "NA"
  177. factor(c("female", "female", "male", "NA", "female"))
  178. # female female male NA female
  179. # Levels: female male NA
  180. data(infert) # 自然以及引产导致的不育症
  181. levels(infert$education) # "0-5yrs" "6-11yrs" "12+ yrs"
  182. # 变量
  183. # 有许多种方式用来赋值
  184. x = 5 # 这样可以
  185. y <- "1" # 更推荐这样
  186. TRUE -> z # 这样可行,但是很怪
  187. #我们还可以使用强制转型
  188. as.numeric(y) # 1
  189. as.character(x) # "5"
  190. # 循环
  191. # for 循环语句
  192. for (i in 1:4) {
  193. print(i)
  194. }
  195. # while 循环
  196. a <- 10
  197. while (a > 4) {
  198. cat(a, "...", sep = "")
  199. a <- a - 1
  200. }
  201. # 记住,在 R 语言中 for / while 循环都很慢
  202. # 建议使用 apply()(我们一会介绍)来错做一串数据(比如一列或者一行数据)
  203. # IF/ELSE
  204. # 再来看这些优雅的标准
  205. if (4 > 3) {
  206. print("Huzzah! It worked!")
  207. } else {
  208. print("Noooo! This is blatantly illogical!")
  209. }
  210. # =>
  211. # [1] "Huzzah! It worked!"
  212. # 函数
  213. # 定义如下
  214. jiggle <- function(x) {
  215. x + rnorm(x, sd=.1) #add in a bit of (controlled) noise
  216. return(x)
  217. }
  218. # 和其他 R 语言函数一样调用
  219. jiggle(5) # 5±ε. 使用 set.seed(2716057) 后, jiggle(5)==5.005043
  220. #########################
  221. # 数据容器:vectors, matrices, data frames, and arrays
  222. #########################
  223. # 单维度
  224. # 你可以将目前我们学习到的任何类型矢量化,只要它们拥有相同的类型
  225. vec <- c(8, 9, 10, 11)
  226. vec # 8 9 10 11
  227. # 矢量的类型是这一组数据元素的类型
  228. class(vec) # "numeric"
  229. # If you vectorize items of different classes, weird coercions happen
  230. #如果你强制的将不同类型数值矢量化,会出现特殊值
  231. c(TRUE, 4) # 1 4
  232. c("dog", TRUE, 4) # "dog" "TRUE" "4"
  233. #我们这样来取内部数据,(R 的下标索引顺序 1 开始)
  234. vec[1] # 8
  235. # 我们可以根据条件查找特定数据
  236. which(vec %% 2 == 0) # 1 3
  237. # 抓取矢量中第一个和最后一个字符
  238. head(vec, 1) # 8
  239. tail(vec, 1) # 11
  240. #如果下标溢出或不存会得到 NA
  241. vec[6] # NA
  242. # 你可以使用 length() 获取矢量的长度
  243. length(vec) # 4
  244. # 你可以直接操作矢量或者矢量的子集
  245. vec * 4 # 16 20 24 28
  246. vec[2:3] * 5 # 25 30
  247. # 这里有许多内置的函数,来表现向量
  248. mean(vec) # 9.5
  249. var(vec) # 1.666667
  250. sd(vec) # 1.290994
  251. max(vec) # 11
  252. min(vec) # 8
  253. sum(vec) # 38
  254. # 二维(相同元素类型)
  255. #你可以为同样类型的变量建立矩阵
  256. mat <- matrix(nrow = 3, ncol = 2, c(1,2,3,4,5,6))
  257. mat
  258. # =>
  259. # [,1] [,2]
  260. # [1,] 1 4
  261. # [2,] 2 5
  262. # [3,] 3 6
  263. # 和 vector 不一样的是,一个矩阵的类型真的是 「matrix」,而不是内部元素的类型
  264. class(mat) # => "matrix"
  265. # 访问第一行的字符
  266. mat[1,] # 1 4
  267. # 操作第一行数据
  268. 3 * mat[,1] # 3 6 9
  269. # 访问一个特定数据
  270. mat[3,2] # 6
  271. # 转置整个矩阵(译者注:变成 2 行 3 列)
  272. t(mat)
  273. # =>
  274. # [,1] [,2] [,3]
  275. # [1,] 1 2 3
  276. # [2,] 4 5 6
  277. # 使用 cbind() 函数把两个矩阵按列合并,形成新的矩阵
  278. mat2 <- cbind(1:4, c("dog", "cat", "bird", "dog"))
  279. mat2
  280. # =>
  281. # [,1] [,2]
  282. # [1,] "1" "dog"
  283. # [2,] "2" "cat"
  284. # [3,] "3" "bird"
  285. # [4,] "4" "dog"
  286. class(mat2) # matrix
  287. # Again, note what happened!
  288. # 注意
  289. # 因为矩阵内部元素必须包含同样的类型
  290. # 所以现在每一个元素都转化成字符串
  291. c(class(mat2[,1]), class(mat2[,2]))
  292. # 按行合并两个向量,建立新的矩阵
  293. mat3 <- rbind(c(1,2,4,5), c(6,7,0,4))
  294. mat3
  295. # =>
  296. # [,1] [,2] [,3] [,4]
  297. # [1,] 1 2 4 5
  298. # [2,] 6 7 0 4
  299. # 哈哈,数据类型都一样的,没有发生强制转换,生活真美好
  300. # 二维(不同的元素类型)
  301. # 利用 data frame 可以将不同类型数据放在一起
  302. dat <- data.frame(c(5,2,1,4), c("dog", "cat", "bird", "dog"))
  303. names(dat) <- c("number", "species") # 给数据列命名
  304. class(dat) # "data.frame"
  305. dat
  306. # =>
  307. # number species
  308. # 1 5 dog
  309. # 2 2 cat
  310. # 3 1 bird
  311. # 4 4 dog
  312. class(dat$number) # "numeric"
  313. class(dat[,2]) # "factor"
  314. # data.frame() 会将字符向量转换为 factor 向量
  315. # 有很多精妙的方法来获取 data frame 的子数据集
  316. dat$number # 5 2 1 4
  317. dat[,1] # 5 2 1 4
  318. dat[,"number"] # 5 2 1 4
  319. # 多维(相同元素类型)
  320. # 使用 arry 创造一个 n 维的表格
  321. # You can make a two-dimensional table (sort of like a matrix)
  322. # 你可以建立一个 2 维表格(有点像矩阵)
  323. array(c(c(1,2,4,5),c(8,9,3,6)), dim=c(2,4))
  324. # =>
  325. # [,1] [,2] [,3] [,4]
  326. # [1,] 1 4 8 3
  327. # [2,] 2 5 9 6
  328. #你也可以利用数组建立一个三维的矩阵
  329. array(c(c(c(2,300,4),c(8,9,0)),c(c(5,60,0),c(66,7,847))), dim=c(3,2,2))
  330. # =>
  331. # , , 1
  332. #
  333. # [,1] [,2]
  334. # [1,] 2 8
  335. # [2,] 300 9
  336. # [3,] 4 0
  337. #
  338. # , , 2
  339. #
  340. # [,1] [,2]
  341. # [1,] 5 66
  342. # [2,] 60 7
  343. # [3,] 0 847
  344. #列表(多维的,不同类型的)
  345. # R语言有列表的形式
  346. list1 <- list(time = 1:40)
  347. list1$price = c(rnorm(40,.5*list1$time,4)) # 随机
  348. list1
  349. # You can get items in the list like so
  350. # 你可以这样获得列表的元素
  351. list1$time
  352. # You can subset list items like vectors
  353. # 你也可以和矢量一样获取他们的子集
  354. list1$price[4]
  355. #########################
  356. # apply()函数家族
  357. #########################
  358. # 还记得 mat 么?
  359. mat
  360. # =>
  361. # [,1] [,2]
  362. # [1,] 1 4
  363. # [2,] 2 5
  364. # [3,] 3 6
  365. # Use apply(X, MARGIN, FUN) to apply function FUN to a matrix X
  366. # 使用(X, MARGIN, FUN)将函数 FUN 应用到矩阵 X 的行 (MAR = 1) 或者 列 (MAR = 2)
  367. # That is, R does FUN to each row (or column) of X, much faster than a
  368. # R 在 X 的每一行/列使用 FUN,比循环要快很多
  369. apply(mat, MAR = 2, myFunc)
  370. # =>
  371. # [,1] [,2]
  372. # [1,] 3 15
  373. # [2,] 7 19
  374. # [3,] 11 23
  375. # 还有其他家族函数 ?lapply, ?sapply
  376. # 不要被吓到,虽然许多人在此都被搞混
  377. # plyr 程序包的作用是用来改进 apply() 函数家族
  378. install.packages("plyr")
  379. require(plyr)
  380. ?plyr
  381. #########################
  382. # 载入数据
  383. #########################
  384. # "pets.csv" 是网上的一个文本
  385. pets <- read.csv("http://learnxinyminutes.com/docs/pets.csv")
  386. pets
  387. head(pets, 2) # 前两行
  388. tail(pets, 1) # 最后一行
  389. # 以 .csv 格式来保存数据集或者矩阵
  390. write.csv(pets, "pets2.csv") # 保存到新的文件 pets2.csv
  391. # set working directory with setwd(), look it up with getwd()
  392. # 使用 setwd() 改变工作目录,使用 getwd() 查看当前工作目录
  393. # 尝试使用 ?read.csv 和 ?write.csv 来查看更多信息
  394. #########################
  395. # 画图
  396. #########################
  397. # 散点图
  398. plot(list1$time, list1$price, main = "fake data") # 译者注:横轴 list1$time,纵轴 wlist1$price,标题 fake data
  399. # 回归图
  400. linearModel <- lm(price ~ time, data = list1) # 译者注:线性模型,数据集为list1,以价格对时间做相关分析模型
  401. linearModel # 拟合结果
  402. # 将拟合结果展示在图上,颜色设为红色
  403. abline(linearModel, col = "red")
  404. # 也可以获取各种各样漂亮的分析图
  405. plot(linearModel)
  406. # 直方图
  407. hist(rpois(n = 10000, lambda = 5), col = "thistle") # 译者注:统计频数直方图
  408. # 柱状图
  409. barplot(c(1,4,5,1,2), names.arg = c("red","blue","purple","green","yellow"))
  410. # 可以尝试着使用 ggplot2 程序包来美化图片
  411. install.packages("ggplot2")
  412. require(ggplot2)
  413. ?ggplot2

获得 R


还没有评论.