作者简介Introduction

数据匠(baidao.net):http://www.baidao.net/

往期回顾

谈谈R中的乱码(一)

谈谈R中的乱码(二)

谈谈R中的乱码(三)

目的

  • 在导入 SPSS Stata 等格式时,提供统一的处理标签的接口;

  • 在输出表格时提供对标签的自动化处理;


什么是标签

SPSS 和 Stata 的用户最熟悉标签:

  • 变量标签

gender `性别`

age    `年龄`

  • 数值标签

gender:

1 = 男性

2 = 女性


R 中如何处理标签

首先,data.frame 没有变量标签的概念(attr 另外再说),变量名行使标签的功能:

table(dt$`性别`)

# 如果标签有空格

table(dt$`a variable`)

其次,可用 factor 提供数值标签功能(factor 其实就等价于字符型):

levels(df$`性别`) <- c('男', '女')


R 包对标签的处理

通过对象属性设置来保存标签:

  • foreign

attr(df, 'variable.labels') # 变量标签

attr(var, 'value.labels')   # 数值标签

  • haven

和 foreign 道理一样,只不过命名方式不同。此外,haven 把变量标签和数值标签都作为变量的属性,而在 foreign 中,变量标签是 data.frame 的属性,数值标签才是变量的属性。

attr(var, 'label')

attr(var, 'labels')

显示在 RStudio 中是这样的:


ezdf 提供统一的数据导入接口

  • 对数据导入提供统一接口,封装 foreign、haven 等包的导入函数;

  • 修正一些 bug,例如:

`haven`: “Error: `x` and `labels` must be same type”


导入 Stata 数据

导入 Stata 数据使用 readStata() 函数:

library(ezdf)

dat <- readStata('CGSS2013(居民问卷)发布版_2014.dta', encoding = 'GB2312') # View(dat)

# 参数 `encoding` 设置 Stata 标签的编码,该参数默认值为 UTF-8。

# 有的 Stata 数据对变量名以及字符变量(string)的值都采用不同编码,对于这种情况,

# 需分别设置 `varNameEncoding` 和 `charEncoding`。 dat <- readStata('CGSS2013(居民问卷)发布版_2014.dta', encoding = 'GB2312',                                   varNameEncoding = 'UTF-8', charEncodin = 'UTF-8')


导入 SPSS 数据

导入 SPSS 数据使用 readSPSS() 函数

# 参数 `lib` 设置导入所使用的 R 包,目前支持 `foreign` 和 `haven`。

readSPSS(file, lib = "foreign", ...)


将 data.frame 转换为 ezdf

用 as.ez(dt, meta) 创建一个新的 ez.data.frame 对象

data(iris)

library(ezdf)

d1 = as.ez(iris) class(d1)

## [1] "ez.data.frame" "data.table"    "data.frame"


ezdf 对标签的设置


变量标签

  • 变量标签存储在 meta 属性当中;

  • meta 可为 data.frame 或 matrix 类型对象:至少包括两列:第一列为变量名,第二列为变量标签。

两个辅助函数:

- `setmeta()`

- `getmeta()`


d1$test = sample(5, size = nrow(iris), replace = T)

# 对新变量 test 设置变量标签

setmeta(d1, data.frame(var= 'test', lbl = '这是新变量标签'))

# 显示数据 d1 的全部变量标签 attr(d1, 'meta')

##     var            lbl

## 1: test 这是新变量标签

# 或者

getmeta(d1)

##     var            lbl

## 1: test 这是新变量标签

varLabels(d1, c('Species', 'test')) ## [1] ""               "这是新变量标签"

# 用 default = "var" 只输出带有标签的变量

varLabels(d1, c('Species', 'test'), default = "var")

## [1] "Species"        "这是新变量标签"

# 返回所有已定义的变量标签

varLabels(d1)

##     var            lbl

## 1: test 这是新变量标签


单独设置部分变量标签

# 设置变量标签

varLabels(d1, "test") <- "新标签"

varLabels(d1, "test")

## [1] "新标签"


数值标签

数值标签的存储采用命名整数向量作为变量的 labels 属性

# 定义一个数值标签

c(C1 = 1, C2 = 2, C3 = 3, MI = 9)

  • valueLabels()

vl1 = valueLabels(d1, 'test')

vl1

## list()

## attr(,"class")

## [1] "value.labels"

## attr(,"ez")

## [1] "d1"

## attr(,"col")

## [1] "test"

# 数值标签可以“加减”。

# 注意: MI=9 设了一个不存在的值标签

vl2 = vl1 + c("Class1"=1, "Class2"=2, "Class3"=3, 'Class4'=4, 'Class5' = 5, MI = 9, MM = 8) valueLabels(d1, 'test') = vl2


制表函数

tbl()

tbl(d1, ~test)

##    test\t新标签  N

## 1:    1++Class1 25

## 2:    2++Class2 37

## 3:    3++Class3 23

## 4:    4++Class4 25

## 5:    5++Class5 40


# 分组求均值,添加样本数

tbl(d1, Sepal.Length ~ Species + test, 'mean', N = T)

##        Species test\t新标签 Sepal.Length  N

##  1:     setosa    1++Class1     5.141667 12

##  2:     setosa    2++Class2     4.923077 13

##  3:     setosa    3++Class3     5.200000  5

##  4:     setosa    4++Class4     5.044444  9

##  5:     setosa    5++Class5     4.836364 11

##  6: versicolor    1++Class1     5.900000  4

##  7: versicolor    2++Class2     5.941667 12

##  8: versicolor    3++Class3     5.908333 12

##  9: versicolor    4++Class4     6.142857  7

## 10: versicolor    5++Class5     5.866667 15

## 11:  virginica    1++Class1     6.533333  9

## 12:  virginica    2++Class2     6.583333 12

## 13:  virginica    3++Class3     6.883333  6

## 14:  virginica    4++Class4     6.344444  9

## 15:  virginica    5++Class5     6.657143 14


# tbl() 默认按照公式右端 x 的值排序,如果取消排序

tbl(d1, Sepal.Length ~ Species + test, 'mean', N = T, sort = F)

##        Species test\t新标签 Sepal.Length  N

##  1:     setosa    4++Class4     5.044444  9

##  2:     setosa    5++Class5     4.836364 11

##  3:     setosa    1++Class1     5.141667 12

##  4:     setosa    2++Class2     4.923077 13

##  5:     setosa    3++Class3     5.200000  5

##  6: versicolor    4++Class4     6.142857  7

##  7: versicolor    2++Class2     5.941667 12

##  8: versicolor    5++Class5     5.866667 15

##  9: versicolor    3++Class3     5.908333 12

## 10: versicolor    1++Class1     5.900000  4

## 11:  virginica    4++Class4     6.344444  9

## 12:  virginica    5++Class5     6.657143 14

## 13:  virginica    2++Class2     6.583333 12

## 14:  virginica    1++Class1     6.533333  9

## 15:  virginica    3++Class3     6.883333  6


ctbl()

ctbl() 是对 table() 的封装,采用 ctbl(ez, expr) 的调用方式。

ctbl(d1, Sepal.Length ~ Species + test)

# 等价于

table(d1$Sepal.Length, d1$Species, d1$test)


ftable()

ftable.ez.data.frame() 方法是对 ftable() 的封装

ftable(ez, formula, style = 1, prop_margin = 1, ...)

  • prop_margin: 行百分比 / 列百分比;

  • style = 1:输出频次;

  • style = 2:输出百分比;

  • style = 3:输出百分比和行加总频次。


ftable(d1, Species~test)

##

##                 setosa     versicolor     virginica

##   1++Class1     12          4         9

##   2++Class2     13         12        12

##   3++Class3      5         12         6

##   4++Class4      9          7         9

##   5++Class5     11         15        14


ftable(d1, Species~test, style = 2)

##

##                        setosa     versicolor     virginica

##   1++Class1 0.4800000  0.1600000 0.3600000

##   2++Class2 0.3513514  0.3243243 0.3243243

##   3++Class3 0.2173913  0.5217391 0.2608696

##   4++Class4 0.3600000  0.2800000 0.3600000

##   5++Class5 0.2750000  0.3750000 0.3500000


(t1 = ftable(d1, Species~test, style = 3))

##                      setosa        versicolor    virginica  N

## 1++Class1 0.4800000  0.1600000 0.3600000 25

## 2++Class2 0.3513514  0.3243243 0.3243243 37

## 3++Class3 0.2173913  0.5217391 0.2608696 23

## 4++Class4 0.3600000  0.2800000 0.3600000 25

## 5++Class5 0.2750000  0.3750000 0.3500000 40


与 markdown 流程整合

  • pander 是用于 markdown 格式输出的 R 包,提供了非常丰富的表格输出功能

  • 在加载 ezdf 包之后,会自动与 pander 包结合,实现自动标签输出

# pander 输出

library(pander) pander(t1, ez = d1)

这是输出的 markdown 结果:

----------------------------------------------------

&nbsp;       setosa   versicolor   virginica   N

--------------- -------- ------------ ----------- ---

**1++Class1**    0.48       0.16        0.36     25

**2++Class2**   0.3514     0.3243      0.3243    37

**3++Class3**   0.2174     0.5217      0.2609    23

**4++Class4**    0.36       0.28        0.36     25

**5++Class5**   0.275      0.375        0.35     40

-----------------------------------------------------

最终输出效果:

pander 与回归结果输出:

# 加上数值标签

options('ezdfKeepVal' = T)

pander(tbl(dat, a66 ~ s5a, 'mean'))

---------------------------------------------------------

s5a 受访者居住的地区类型是   a66 您家是否拥有家用小汽车

---------------------------- ----------------------------

1++市/县城的中心地区                1.761

2++市/县城的边缘地区                1.775

3++市/县城的城乡结合部               1.809

4++市/县城区以外的镇                1.859

5++农村                       1.919

---------------------------------------------------------

数值与标签之间分隔符

options('ezdfValueLabelSep' = '=')

pander(tbl(dat, a66 ~ s5a, 'mean'))

---------------------------------------------------------

s5a 受访者居住的地区类型是   a66 您家是否拥有家用小汽车

---------------------------- ----------------------------

1=市/县城的中心地区                 1.761

2=市/县城的边缘地区                 1.775

3=市/县城的城乡结合部                1.809

4=市/县城区以外的镇                 1.859

5=农村                       1.919

---------------------------------------------------------

回归模型的输出:

m1 = lm(a6 ~ a2 + a10, dat)

pander(m1)

这是通过 markdown 输出转成 pdf 后的效果,没有任何手工干预(pandoc 在输出小数点时,还有一点瑕疵,比如小数点位数不统一,不过本人 github 上的版本已经修正了这个问题)。


表格输出选项

目前提供三个选项:

  • options('ezdfKeepVal' = T)

  • options('ezdfValueLabelSep' = '=')

  • options('ezdfKeepVarName' = T)


options('ezdfKeepVal' = T)

options('ezdfValueLabelSep' = '=')

options('ezdfKeepVarName' =  F)

tbl(d1, ~test)

##      新标签  N

## 1: 1=Class1 25

## 2: 2=Class2 37

## 3: 3=Class3 23

## 4: 4=Class4 25

## 5: 5=Class5 40

pander(tbl(d1, ~test))


options('ezdfKeepVarName' =  T)

options('ezdfValueLabelSep' = '++')

pander(tbl(d1, ~test))


下载与安装

github: https://github.com/huashan/ezdf

 往期精彩内容整理合集 

2017年R语言发展报告(国内)

R语言中文社区历史文章整理(作者篇)

R语言中文社区历史文章整理(类型篇)

公众号后台回复关键字即可学习

回复 R                  R语言快速入门及数据挖掘 
回复 Kaggle案例  Kaggle十大案例精讲(连载中)
回复 文本挖掘      手把手教你做文本挖掘
回复 可视化          R语言可视化在商务场景中的应用 
回复 大数据         大数据系列免费视频教程 
回复 量化投资      张丹教你如何用R语言量化投资 
回复 用户画像      京东大数据,揭秘用户画像
回复 数据挖掘     常用数据挖掘算法原理解释与应用
回复 机器学习     人工智能系列之机器学习与实践
回复 爬虫            R语言爬虫实战案例分享

R 包 `ezdf`的讲解相关推荐

  1. 包r语言_R语言入门之寻找你的R包

    关于寻找目标R包,一般可以在官网利用关键词搜索即可获得相关信息,不过米老鼠在这里想给大家介绍一个特别的R包,它可以帮助你寻找你想要的理想R包. 不过,在正式讲解,我想和大家提醒一下安装R包的注意事项: ...

  2. 把函数包起来就是一个R包 - 完整开发指南

    生物信息学习的正确姿势 NGS系列文章包括NGS基础.高颜值在线绘图和分析.转录组分析 (Nature重磅综述|关于RNA-seq你想知道的全在这).ChIP-seq分析 (ChIP-seq基本分析流 ...

  3. R包中文文本挖掘chinese.misc的中文说明

    转载:https://github.com/githubwwwjjj/chinese.misc 中文文本分析方便工具R包chinese.misc的中文说明 很多人都问过的问题: (1)哪里有更多介绍? ...

  4. R · R 包开发 | 保姆级教程

    R · R 包开发 一般在初始阶段我们都是使用别人的函数来完成大部分任务,那些函数大多来自 R 标准安装的包或者可以从 CRAN 下载的包. 安装新的包可以拓展 R 的功能.比如说,安装 ggplot ...

  5. 跟着Nature学绘图!基于ggplot2的生存曲线绘制R包

    与传统的语言模型不同,深度学习的进步导致了一种新型的预测(自回归)深度语言模型(DLM).使用自我监督的下一个单词预测任务,这些模型在给定的上下文中生成适当的语言响应.在目前的研究中,九名参与者收听了 ...

  6. Shiny平台构建与R包开发(七)——Shiny APP部署

    本节展示了如何分享和部署Shiny APP.您可以将开发好的Shiny APP部署在自己的服务器上,或是将其部署在公共的平台(即shinyapps.io)上.这里仅分享后者.对于如何将Shiny AP ...

  7. Shiny平台构建与R包开发(五)——ui美化

    本节简单地向读者介绍Shiny APP中ui的美化方法. shinythemes 利用shinythemes包,您可以选择不同的bootstrap风格,并将其应用到Shiny APP中. 安装完shi ...

  8. Shiny平台构建与R包开发(四)——按钮与响应事件

    作为Shiny平台构建与R包开发教程的第四小节,本节向读者进一步强调Shiny server的工作机理,并由此设计按钮点击事件. Shiny server工作机理与问题 前面的几个小节已经向读者初步解 ...

  9. Shiny平台构建与R包开发(三)——数据输出

    作为Shiny平台构建与R包开发教程的第三小节,本节向读者展示如何利用Shiny server输出自己想要的数据,包括Rplot.Table.Text等信息. 数据输出机制 仍以上一节的案例为基础: ...

  10. Shiny平台构建与R包开发(二)——数据输入

    作为Shiny平台构建与R包开发教程的第二小节,本节向读者介绍如何利用Shiny server处理用户输入的各种信息.这些信息既包括用户向Shiny上传的数据集,也包括用户对Shiny页面的各种控件( ...

最新文章

  1. Pandas通过某列不是NaN来进行筛选
  2. HTML怎么限制每行字数,JS实现每行固定字数,自动换行
  3. SQLlite在安卓中的基本详解和简单使用
  4. poj1703Find them, Catch them(并查集以及路径压缩)
  5. 百度阿里网易大疆等大小厂前端校招面筋 | 掘金技术征文
  6. maven 单独构建多模块项目中的单个模块
  7. matlab所有画图函数总结——20210318
  8. EASY UI tree如何根据部分值来选中checkbox
  9. 二维码图片处理换logo,加文字
  10. Linux基础入门到精通之虚拟机中安装Linux系
  11. word里画的流程图怎么全选_流程图怎么做?用Word制作流程图超方便!
  12. 计算一点绕另一点旋转n度后的坐标
  13. mysql 纯真ip 导出dat_3步搞定纯真IP数据导入到MySQL详解
  14. 计算机怎么设置内存数据恢复,相机内存卡数据恢复的操作图解
  15. Kotlin Sealed 是什么?为什么 Google 都用
  16. 微信网页开发——随手笔记
  17. 智慧文娱,阿里巴巴文娱技术探索之路
  18. R语言1----Excel格式数据的导入
  19. [推荐系统]个性化推荐的十大挑战
  20. 物联网省/国赛AIOT智能家居全流程演示

热门文章

  1. 分表分页/跨库分页为什么这么难?
  2. 一个 Spring Boot 项目该包含哪些?
  3. 开源的IDE?还真是头一次见!Github标星30.7K!值得拥有!
  4. Spring Boot 你为什么这么耗内存?
  5. 女程序员上班第一件事:调整IDE颜色以适配今天的衣着妆容
  6. 2018想要薪资翻倍?你需要掌握这个技能
  7. 说说年度补税退税的问题
  8. matlab画交通标志,基于MATLAB的交通标志设计方法研究
  9. Python基础之变量、输入、输出
  10. 基于CentOS7配置ArcGIS enterprise