R语言备忘录

Posted 无安书

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了R语言备忘录相关的知识,希望对你有一定的参考价值。



读取 Excel 文件,这个问题,应该辩证性地看待:

1/  是否经常需要读取 Excel 文件,如果是日常需要,并且需求大、频率高,那么确实需要在这方面深入学习。

2/ 一年就只碰到两三次读取 Excel 文件的需求。。。 那么,很明显地,其实并不需要掌握专门地读取 Excel 文件的办法


因此,下面的内容主要针对以上两种情况来分别展开说明。




Excel 文件固然常见,但因为其本身的简洁性、以及缺乏严格的格式控制规则,导致了往往出现的 Excel 文件会因为种种人为修改原因,成为了 「脏乱的数据

事实上,csv 文件最为常见,也更为规范,具备平台通用性。针对于不经常读取 Excel 文件的人来说,实在没有必要深入学习并掌握 Excel 文件如何读取。更多的简便方法则是:

1/ Excel 文件转为 csv 格式
2/ 复制所需内容后,转为 R 语言中的数据格式

关于第一种方法,看似简单,实则涉及到众多的易错点:

1/ 很多人压根就不检查原有的 Excel 文件里的内容是否符合 csv 格式的要求,直接转。。。

2/ 考虑过度,多想一步,在犹豫不决后,果断地选择 「UTF-8 格式的 csv」


这里需要说明的是:

CSV UTF-8 (逗号分隔)
CSV (逗号分隔)
#---------------------
文本文件(制表符分隔)
Unicode 文本

csv 以及 txt 格式分别对应的第一种是标准的格式,而各自对应的第二种则:会加入 BOM (为:byte-order mark, 字节顺序标志)。目前来说,后者并不能被通用使用,主要见于 Windows 平台上的规范。因此,标准的转格式方式,也仅仅是选择前者。


BOM 格式,无法被准确读取识别。


而 csv 文件,使用read.csv()完成读取; txt 格式,使用 read.delim() 完成读取。





3/ Excel 里的大问题:

 ① 出现合并列名称

 ②  出现数据 「缺少」, 也就是所谓的简写。。。

如下:

120 76
  78 55
  83 90
  82 104
93 96
  65 50
  98 86
94 73
  96 113
  80 55
  100 71
  105 85
类似于:上述的第一列,只有三个值,但每个值下面的空格,已经暗示了这部分内容与上面的值相同,这只是所谓的「偷懒」操作,并不能被软件正常识别。
以上问题的解决方案,仅仅只有:
手动修改复原列名称,利用填充功能补全空白内容。
否则,不规范的数据格式,只能是「 引火上身

对于少量的数据,并不需要另存为 csv, txt 等格式来读取。比如说:仅仅只有七八行,其实,读取粘贴板信息,即可完成操作,或者是:利用 text 参数来读取复制后的字符串。
'a b c d e
120 76 52 62 120
78 55 118 105 70
83 90 94 73 110
82 104 96 113 52
93 96 80 55 101
65 50 100 71 55
98 86 105 85 82 '
 %>% 
  read.table(text =., header = T)
或者采用:
a <- read.delim('clipboard')

另外的注意事项:
极容 易被忽略的参数:
nrows
skip
row.names
colClasses
fill
fillEncoding
text

 对于向量型数据 ,使用  scan() 获得向量 ,方法与上述类似。
至此,简单的读取操作,已顺利完成。



至于长期需要读取 Excel 文件,或者是需要一次性读取大量的 Excel 文件,则进入到专门的数据读取环节:
到目前为止,至少有 5 个包可以读取或处理 excel 文件:    

xlsx,readxl,writexl,XLConnect,openxlsx

目前而言, readxl , writexl   更被 推荐使用,但 xlsx  需要 Java 环境
 对于它们的流行程度,可以简单地从各个包的下载量上窥见一二:

使用 cranlogs 包,获取各个包的下载量数据:
library(cranlogs)
cran_downloads(c("xlsx","readxl","writexl",'XLConnect',
                 'openxlsx'),
               'last-week') %>%
ggplot(aes(date,count,
              group = package)) + 
  geom_line() + 
  geom_point(aes(pch = package))
图像:

R语言备忘录(二)


优化 x 轴标签:
cran_downloads(c("xlsx","readxl","writexl",'XLConnect',
                 'openxlsx'),'last-week') -> g1
q1 <- unique(g1$date)
library(scales)
q + scale_x_date(breaks = q1,
                  labels = date_format('%b %d'))
图像:

R语言备忘录(二)

所谓的  q  为第一次的绘图代码。

当然,也可以调整标签的角度:
q + scale_x_date(breaks = q1,
                  labels = date_format('%b %d')) + 
   theme(axis.text.x = element_text(angle = 25,
                                    hjust = 1))
图像:

R语言备忘录(二)


后续不再优化作图细节,从上述的图表中已经反映了过去一周以来,这五个包的下载量的区别。

类似的,获取近一个月以来的下载数据:
cran_downloads(c("xlsx","readxl","writexl",'XLConnect',
                 'openxlsx'),
               'last-month') %>%
ggplot(aes(date,count,
              group = package)) + 
  geom_line() + 
  geom_point(aes(pch = package))  
图像:

R语言备忘录(二)



接着,获取近一年来的下载情况:
cran_downloads(c("xlsx","readxl","writexl",'XLConnect',
                 'openxlsx'),
               from = '2019-08-09',
               to = '2020-08-09') -> g2
    g2 中储存着过去一年中每一天各个包的下载量数据,必须分类计算出各个包每个月的下载总量:
f <- c(23,30,31,30,31,31,29,31,30,31,30,31,9)
ff <- factor(rep(c(month.abb[8:12],month.abb[1:7],'Aug2'), f) %>%
      rep(5) ,
      levels = c(month.abb[8:12],month.abb[1:7],'Aug2'))
#-----------------------
g3 <- cbind(g2,ff)
aggregate(g3$count,
          by = list(package = g3$package,
                   month = g3$ff),sum) -> h1
#++++++++++++++++++++++++++
ggplot(h1,aes(month,x,group = package)) + 
  geom_line() + 
  geom_point(aes(pch = package)) + 
  ylab('count')
图像:

R语言备忘录(二)

要点,创 建新的因子,用以分类;利用  aggregate()    进行分类求和 整理出的数据 ,用以绘 图。 整个过程中一直是长数据的处理
特别需要注意: 必须指定因子的水平!
接着,需要重新处理 x 轴上的时间标签:
H <-  seq(as.Date('2019-08-09'),
    by = 'month',
    length.out = 13) %>% rep(each = 5
h2 <- h1 %>% mutate(month = H)
#--------------------------------
ggplot(h2,aes(month,x,group = package)) + 
  geom_line() + 
  geom_point(aes(pch = package)) + 
  ylab('count') -> Q
#********************************
fg <- seq(as.Date('2019-08-09'),
          by = 'month',
          length.out = 13)
Q + scale_x_date(breaks = fg,
                 labels = date_format('%Y %b')) + 
  theme(axis.text.x = element_text(angle = 45,
                                   hjust = 1))
#+++++++++++++++++++++++++++++++++++++++++++++++
图像:

事实上,对图例中的元素位置,还需要做调整。这里,暂不继续修改。
以上图表反映了这 5 个包的下载量随时间变化情况。从一定程度上能够反映出包的流行程度。
后续,会对本次作图代码继续优化。
关于如何读取 Excel 文件,事实上,上述各个包中的帮助文档已经提供了明确的说明,实在没有搬运的必要,因此,不再一一阐述。


另外,
library(Visualize.CRAN.Downloads)
processPckg("xlsx")
processPckg("writexl")
processPckg("readxl")
processPckg("XLConnect")
processPckg("openxlsx")
processPckg(c("xlsx","readxl","writexl",'XLConnect',
              'openxlsx'),
            "2001-01-01")
Visualize.CRAN.Downloads 包提供了简便的下载量可视化功能,已经封装好了,只需要调用函数即可。
通过上述代码,可以获取下载量数据的可视化图表,并在本地生成 html 文件及 pdf 文件。


或者,也可以:
retrievePckgData("xlsx") %>% 
  as.data.frame() -> xl2
ggplot(xl2,aes(date,count)) + 
  geom_line()
图像:


上图中,有一天的下载量突增,需要引起重视:

而这一天为:

> xl2[which.max(xl2$count),]
          date count package
272 2020-05-07 25390    xlsx
在 2020年5月7日,xlsx 包的下载量达到历史高点:25390 次。
至于图表的继续修改,则不再进行。

---end---

以上是关于R语言备忘录的主要内容,如果未能解决你的问题,请参考以下文章

R语言备忘录

R语言备忘录

Flutter 布局备忘录

在R Markdown中创建备忘录

vs code 自定义代码片段

r R有用的代码片段