今天在写代码的时候,发现项目中出现了一些重复的代码,所以要把他们封装成一个单个函数。在封装的过程中,我遇到了一个让我头疼的问题。

在使用dplyr的时候,你可能会注意到一个非常有趣的细节,那就是你不用""来区别变量和字符串,dplyr能够帮你好这个事情。举个例子,下面的代码都是让iris数据集按照"Sepal.Length"进行排序。

group_by(iris, Sepal.Length)
group_by(iris, "Sepal.Length")

这时候,让我们思考一个问题,如果在之前命名了一个group.by <- "Sepal.Length",那么运行group_by(iris, group.by)的时候, 这个group.by会被替换成Sepal.Length吗?下面的代码会报错吗?大家可以思考一下,然后往下看。

group.by <- "Sepal.Length"
group_by(iris, group.by)

实际上,运行上面的代码,你会得到一个报错"Error: Column group.by is unknown". group_by没有替换掉你的变量名。

为什么会出现这个情况?这个就涉及到dplyr编程的内容,具体可以参考https://cran.r-project.org/web/packages/dplyr/vignettes/programming.html

参考dplyr的教程,如果要让上面的代码能够运行,我们需要需要在变量名前加上!!或者调用UQ函数

group_by(iris, !!group.by)
group_by(iris, UQ(group.by))

假如你要创造一个函数,要用到group_by,那么你应该怎么写呢?我们的直觉就是下面的代码

my_group_by <- function(df, group.by){df <- group_by(df,group.by )
}

根据前面的铺垫,你应该知道,运行my_group_by(iris, Sepal.Length)会出现报错,报错信息为" Error: Column group.by is unknown"。 于是你试着之前的解决方法加上了"UQ"

my_group_by <- function(df, group.by){df <- group_by(df, UQ(group.by) )return(df)
}

思考下,my_group_by(iris, Sepal.Length)能够得到结果吗?

很遗憾,代码报错了

 Error in splice(dot_call(capture_dots, frame_env = frame_env, named = named,  : object 'Sepal.Length' not found

正确的调用方法是my_group_by(iris, "Sepal.Length"). 当然由于你用习惯了dplyr,你希望是my_group_by(iris, Sepal.Length)调用代码,那么你的函数需要怎么写呢?为了解决这个问题,你可能要仔细阅读https://cran.r-project.org/web/packages/dplyr/vignettes/programming.html才行,理解什么叫做"Quasiquotation"

经过一波折腾之后,我受够了这种将dplyr代码改成函数时的不一致性(也可能是我不熟练),我决定还是只用R基础代码来实现我的功能,不就是分组排序吗,为啥一定要用group_byarrange呢.

无非就是先利用因子将数据库分成多个列表(split),然后对每个列表按照某一列进行排序(lapply),而这里排序过程就是获取从最大到最小的索引(order),最后按行进行合并(do.call, rbind)而已呀。如下是实现的代码

my.group.by <- function(df, group.by, sort.by,decreasing = TRUE){df.split <- split(df, df[[group.by]])df.split.sort <- lapply(df.split, function(x){x.order <- order(x[[sort.by]],decreasing = decreasing)x <- x[x.order,]x})df <- do.call(rbind, df.split.sort)return(df)
}my.group.by(iris, group.by = "Species", sort.by = "Sepal.Length")

逃离dplyr: 不使用group_by和arrange实现分组排序相关推荐

  1. R语言dplyr包使用group_by函数、arrange函数和filter函数获取每个分组的第一个、第N个、最后一个记录实战

    R语言dplyr包使用group_by函数.arrange函数和filter函数获取每个分组的第一个.第N个.最后一个记录实战 目录

  2. R语言使用dplyr包使用group_by函数、summarise函数和mutate函数计算分组下的均值、标准差、样本个数、以及分组均值的95%执行区间对应的下限值和上限值(Calculate CI)

    R语言使用dplyr包使用group_by函数.summarise函数和mutate函数计算分组下的均值.标准差.样本个数.以及分组均值的95%执行区间对应的下限值和上限值(Calculate 95% ...

  3. R语言dplyr包使用group_by函数和summarise函数构建频率表实战

    R语言dplyr包使用group_by函数和summarise函数构建频率表表实战 目录 R语言dplyr包使用group_by函数和summarise函数构建频率表表实战

  4. R语言使用dplyr包的group_by函数和summarise函数基于分组变量计算目标变量的均值、标准差

    R语言使用dplyr包的group_by函数和summarise函数基于分组变量计算目标变量的均值.标准差(Difference in means and standard deviation of ...

  5. R语言使用dplyr包的group_by函数和summarise函数基于分组变量计算分析中涉及的所有协变量的均值(Difference in means of covariates)

    R语言使用dplyr包的group_by函数和summarise函数基于分组变量计算分析中涉及的所有协变量的均值(Difference in means of covariates) 目录

  6. R语言dplyr包使用dplyr函数使用group_by函数、summarise函数和mutate函数计算分组占比实战

    R语言dplyr包使用dplyr函数使用group_by函数.summarise函数和mutate函数计算分组占比实战 目录 R语言dplyr包使用dplyr函数使用group_by函数.summar ...

  7. R语言使用dplyr聚合统计分组数据、ggplot2可视化分组线图、使用geom_line函数自定义设置线条类型、粗细、颜色(Change line types + colors by groups)

    R语言ggplot2可视化分组线图.使用geom_line函数自定义设置线条类型.宽度(粗细.).颜色(Change line types by groups.Change line types + ...

  8. 10. Joining Data with dplyr in R

    文章目录 1. Joining Tables 1.1 The inner_join verb (video) 1.2 What columns would you join on? 1.3 Joini ...

  9. R语言使用dplyr包的arrange函数对dataframe数据进行排序

    R语言使用dplyr包的arrange函数对dataframe数据进行排序 目录 R语言使用dplyr包的arrange函数对dataframe数据进行排序 R语言使用dplyr包的arrange函数 ...

最新文章

  1. hdu 1272 小希的迷宫 (并查集)
  2. vs2010本地调试打不开网页
  3. uboot: RTL8201 100M PHY驱动代码
  4. android 动态申请权限_你真的了解Android权限机制吗?
  5. Android 4 开发环境配置中的诸多陷阱
  6. echarts grid的样式位置_vue使用Echarts vue使用Echarts滚动条
  7. Java学到什么程度可以找工作?
  8. java HTML5 学习资料汇总
  9. Visual C++ 2010 Express中文版如何下载
  10. 1和4互素吗_互素是什么意思判别方法,1和2互素,互素
  11. 分享一个精灵盛典辅助工具挂机方案
  12. 你阳了吗?可以接种最新加强针疫苗了!
  13. poe交换机供电方法
  14. 监控视频压缩存储该如何解决?
  15. 移动设备与操作系统多样性将扩大网络犯罪空间
  16. 破解 ----- 内购
  17. 车轮向北 2007.10.02
  18. ElasticSearch搜索时不算分API
  19. css li元素平分父div
  20. bat 等待输入_打碟使用的音频输入渠道总结和相关入门科普

热门文章

  1. spring代理工厂类图
  2. 网页要展示大量图片时怎样延迟加载图片 lyz.delayLoading.min.js
  3. IP有效载荷压缩协议(IPComp)
  4. discuz论坛手机端投放广告
  5. AWIT DBackup 0.0.20 发布,备份系统
  6. 华三交换机ping大包命令_如何Ping大包命令_Ping大包命令格式详解-win10铺
  7. J2EE从入门到入土02.Set及Map集合解析
  8. mysql数据类型--[整数类型]--smallint类型
  9. C++中std::string与C-String字符数组的互相转换
  10. Azorult变种病毒样本分析笔记