R语言已经存在上万的开源包,总会有一个包满足需求。当一个真香的调参侠才可节省时间。
以windows系统为平台,这里展示一个开发R包的简单流程。通过R包的形式实现一个多分类变量哑变量的功能。
可以回复
easydummy
下载这个文件夹,双击
文件夹内easydummy.Rproj
用Rstudio
打开项目。也可以手撸代码。
哑变量是以多分类变量取值为变量,生成1是,0否的情况。如多分类变量为喜欢吃的水果,取值为苹果、香蕉、西瓜。哑变量后,苹果、香蕉、西瓜各自为一个单独变量,取值为1代表喜欢吃,0代表不喜欢吃。
必要条件
install.packages("devtools")
本次包的开发需要使用stringr包,自行安装。
Rstudio中点击File
- New Project
- New Directory
- R Package
- 给自己R包取名和选择包地址,确定即可。
这里命名为easydummy
可以看到easydummy文件包含以下内容
man
(编写帮助文档,平时help()函数查看的就是这里面的内容)R
(存放R代码的地方)DESCRIPTION
(R包的相关描述)NAMESPACE
(用来规定可以调用的R函数功能,如果这里没有写明,即是R文件夹里面有相关函数功能也不能在之后调用)其他
(一些项目地址之类的内容,不需要理会)Rstudio在建立R包项目时会自动生成一个Hello函数,这里把R文件夹
里hello.R
和man文件夹
里hello.Rd
以及NAMESPACE文件
删除。
这三者存在联动关系。实际开发中,使用devtools等辅助包相关函数,可以关注于R函数的编写,自动生成man文件夹
和NAMESPACE文件
相关内容。
在Rstudio中打开DESCRTION文件,编写包的描述。
相关内容包括:
Package
:包的名字Type
: Package(类型)Title
: 包的介绍,这里的内容就是Rstudio
中Packages
面板下各种包的描述Version
: 0.1.0(版本号,版本号存在一定规范。这里只是一个简单的R包开发教程,不需理会)Author
: 作者Maintainer
: The package maintainer [email protected](包的贡献者名字及邮箱)Description
: 包的描述License
: 许可证(包的公共许可,开源程序的特色。这里也不理会,以GPL-3为协议)Encoding
: UTF-8(编码方式)LazyData
: true(R包内置数据时选中)Depends
: 依赖环境Imports
: 需要使用的包Suggests
: 建议配合使用的包其他
如网址、bug报告地址等内容,这里不涉及。本包的DESCRIPTION如下:
Package: easydummy
Type: Package
Title: make dummy easy
Version: 0.1.0
Author: DA_BY_R
Maintainer: DA_BY_R
Description: this package was my first package
License: GPL-3
Depends:
R (>= 3.5.0)
Imports:
stringr,
stats
Encoding: UTF-8
LazyData: true
Imports导入包需要使用
usethis::use_package('包名')
生成。
如usethis::use_package(‘stringr’),usethis::use_package(‘stats’)
Rstudio中File
- New File
- R Script
生成一个文件,将其命名为easydummy.R,保存在项目
的R文件夹
内。
接下来就是在easydummy文件中编写函数内容,以实现功能
学会调用各种基本函数,实现各种功能的过程,对R语言的理解、函数调用与熟悉具有极大的提升。
实现一个哑变量功能,基本函数如下。
本次仅介绍R语言包的开发过程。
具体的函数内容并不需要理会,直接复制即可
(#后注释如果有碍观瞻,也可以删除)。仅仅是为了说明R函数功能实现的思路
。
要实现哑变量功能,需要数据和需要哑变量化的变量位置。因此这里选择两个参数
data:数据框类型数据
loc:变量的位置
easydummy <- function(data,loc) {
#需要数据没有缺失值
#complete.cases函数判断数据各行是否完整
#which函数确定提取完整数据的行的位置
#依次选中无缺失值数据
data <- data[which(complete.cases(data)),]
#用apply向量化函数替代for循环,遍历数据
#用unique函数求各列(变量)唯一值
unique <- apply(data, 2, unique)
#得到需要哑变量化的变量的唯一值
values <- unique[[loc]]
#建立一个仅含一个变量的空数据框。
#变量名可以是任何名字(x,y,z之类)会删除。
zero <- data.frame(z=0)
#用for循环遍历唯一值,将各取值化作变量。
for (val in values) {
zero[val] <- 0
}
#删除第一列,即删除z变量
#这时为仅含唯一值转化的变量的空数据框
z <- zero[-1]
#for循环嵌套for循环
#第一个for循环遍历数据各行
#第二个for循环遍历各唯一值
for (i in 1:nrow(data)) {
for (len in 1:length(values)) {
#用stringr包str_detect函数检测哑变量的那一列的每行是否存在各唯一值
if (str_detect(data[i,loc],values[len])==TRUE) {
#如果存在的话,z空数据框的i行len列等于1
z[i,len]=1
}else{
#如果不存在的话,z空数据框的i行len列等于0
z[i,len]=0
}
}
}
#用cbind函数将原数据与z数据框拼接,命名为data
data <- cbind(data,z)
#返回data数据框
return(data)
}
这个函数如果仔细看还有许多粗糙与改进之处,如
哑变量要求多分类变量
,可以用变量类型是否为因子类型
来缩小搜索范围
。for循环是否可以用向量化函数
提升等等。
使用devtools包相关功能可以专注于R函数功能,编写文档只需要在R函数文件
内代码上方以#‘
开头加入各种roxygen2包相关函数即可(无需加载)。
一般来说:
标题
空行
描述
空行
细节
接下来是一些细节文档
@param
函数参数@return
说明本函数返回值@importFrom
包名 函数名 函数名@export
(不添加,这个函数就不显示也就不能直接使用
)@examples
提供示例代码easydummy函数的代码与文档描述为:
#'@title easydummy
#'
#'@description a friendly funtion that dummy your data
#'
#'@details I used some funtions in base R,like unique,gen a new funtion.
#'by the way,this is my first package,it's true.
#'
#'@param data need a dataframe
#'@param loc location of your want dummy
#'@return a dataframe
#'@importFrom stats complete.cases
#'@importFrom stringr str_detect
#'@export
#'@examples
#'easydummy(iris,5)
easydummy <- function(data,loc) {
data <- data[which(complete.cases(data)),]
unique <- apply(data, 2, unique)
values <- unique[[loc]]
zero <- data.frame(z=0)
for (val in values) {
zero[val] <- 0
}
z <- zero[-1]
for (i in 1:nrow(data)) {
for (len in 1:length(values)) {
if (str_detect(data[i,loc],values[len])==TRUE) {
z[i,len]=1
}else{
z[i,len]=0
}
}
}
data <- cbind(data,z)
return(data)
}
可以内置数据,以方便包的函数功能展示。
在easydummy文件夹
内新建data文件夹
。
使用save(数据,file=‘文件名.rda’)方式生成数据
如save(iris,file = 'iris.rda')
rda文件
放在data文件夹下如果内置数据同样需要描述(过程与R代码文档类似),在R文件夹内生成data同名R文件
如iris.R
依次填写:
@docType data
(必须填写,类型必须为data)@name 数据名
(必须填写)@format
说明文件格式(可选)@soure
说明数据来源(可选)NULL
(这个文件内容不能为空,否则不能检测,填写NULL表示下存在感)其他
本包数据描述为:
#'somedata
#'
#'used to demo of this package
#'@docType data
#'@name iris
NULL
使用devtools包document()函数自动生成文档
Rstudio中ConSole面板输入devtools::document()
duang~
man文件夹内的内容与NAMESPACE文件就自动生成了
devtools::document()
#余下为输出结果(有删减)
Updating easydummy documentation
Writing NAMESPACE
Loading easydummy
Writing NAMESPACE
Writing easydummy.Rd
Writing iris.Rd
Rstudio中点击Build
面板Installand Restart
,即自动打包.
也可以点击Check
检查是否符合规范
生成包完成后可以试用包的效果,以便修改完善。
使用help函数help('easydummy',package = 'easydummy')
可以看到和其他包一样的帮助文档
函数试用
data <- easydummy(iris,5)
View(data)
这仅仅是一个功能单一的R包,可以不断添加函数,以完善包。还可以为这个包添加demo和pdf文档等等。
具体可以参考书籍:
Hadley Wickham
:R Packages
,Writing R Extensions
:繁杂细致主要发表平台为:
作为一个自用野包,放在github上,使用devtools包安装即可。当然某天野包也会转正。
R 语 言 小 白 速 通 R语言小白速通 R语言小白速通
懂 点 R 语 言 懂点R语言 懂点R语言
欢 迎 分 享 收 藏 关 注 欢迎分享收藏关注 欢迎分享收藏关注