为列名传递变量?

2024-02-21

例如,假设您有一个应用了某些 DPLYR 函数的函数,但您不能期望传递给该函数的数据集具有相同的列名称。

举一个简单的例子来说明我的意思,假设你有一个数据框,arizona.trees:

arizona.trees
group arizona.redwoods   arizona.oaks 
A     23                 11        
A     24                 12  
B     9                  8 
B     10                 7
C     88                 22

和另一个非常相似的数据框,california.trees:

california.trees
group    california.redwoods california.oaks 
A        25                  50        
A        11                  33  
B        90                  5 
B        77                  3
C        90                  35

您想要实现一个函数,返回给定类型的树的给定组(A、B、...Z)的平均值,该树适用于这两个数据框。

foo <- function(dataset, group1, group2, tree.type) { 
     column.name <- colnames(dataset[2])
     result <- filter(dataset, group %in% c(group1, group2) %>%
               select(group, contains(tree.type)) %>%
               group_by(group) %>%
               summarize("mean" = mean(column.name))
     return(result)
}

调用所需的输出foo(california.trees, A, B, redwoods)将会:

result
       mean
A       18
B       83.5

由于某种原因,做类似实施的事情foo()只是似乎不起作用。这可能是由于数据帧索引存在一些错误 - 该函数似乎认为我正在尝试获取column.name字符串,而不是检索列并将列传递给mean()。我不知道如何避免这种情况。存在隐式传递修改后的数据帧的问题,该数据帧无法直接用可能导致问题的管道运算符引用。

为什么是这样?是否有一些可行的替代实施?


我们可以使用quosure基于开发版本的解决方案dplyr(即将发布0.6.0)

foo <- function(dataset, group1, group2, tree.type){
        group1 <- quo_name(enquo(group1))
         group2 <- quo_name(enquo(group2))
         colN <- rlang::parse_quosure(names(dataset)[2])
         tree.type <- quo_name(enquo(tree.type))
        dataset %>%
                filter(group %in% c(group1, group2)) %>%
                select(group, contains(tree.type)) %>%
                group_by(group) %>%
                summarise(mean = mean(UQ(colN)))
        }


foo(california.trees, A, B, redwoods)
# A tibble: 2 × 2
#  group  mean
#  <chr> <dbl>
#1     A  18.0
#2     B  83.5

foo(arizona.trees, A, B, redwoods)
# A tibble: 2 × 2
#   group  mean
#  <chr> <dbl>
#1     A  23.5
#2     B   9.5

The enquo获取输入参数并将其转换为quosure, with quo_name,它被转换为字符串以供使用%in%,第二列名称转换为quosure从字符串使用parse_quosure然后它不被引用(UQ or !!) 内进行评估summarise

注意:这是基于OP关于选择第二列的功能


上述解决方案基于根据位置选择列(根据OP的代码),它可能不适用于其他列。因此,我们可以匹配“tree.type”并根据该值获取列的“平均值”

foo1 <- function(dataset, group1, group2, tree.type){

        group1 <- quo_name(enquo(group1))
         group2 <- quo_name(enquo(group2))


         tree.type <- quo_name(enquo(tree.type))
        dataset %>%
                filter(group %in% c(group1, group2)) %>%
                select(group, contains(tree.type)) %>%
                group_by(group) %>%
                summarise_at(vars(contains(tree.type)), funs(mean = mean(.)))
        }

可以针对两个数据集中的不同列测试该函数

foo1(arizona.trees, A, B, oaks)
# A tibble: 2 × 2
#  group  mean
#   <chr> <dbl>
#1     A  11.5
#2     B   7.5

foo1(arizona.trees, A, B, redwood)
# A tibble: 2 × 2
#  group  mean
#   <chr> <dbl>
#1     A  23.5
#2     B   9.5

foo1(california.trees, A, B, redwood)
# A tibble: 2 × 2
#  group  mean
#   <chr> <dbl>
#1     A  18.0
#2     B  83.5

foo1(california.trees, A, B, oaks)
# A tibble: 2 × 2
#  group  mean
#  <chr> <dbl>
#1     A  41.5
#2     B   4.0

data

arizona.trees <- structure(list(group = c("A", "A", "B", "B", "C"), 
arizona.redwoods = c(23L, 
24L, 9L, 10L, 88L), arizona.oaks = c(11L, 12L, 8L, 7L, 22L)),
.Names = c("group", 
"arizona.redwoods", "arizona.oaks"), class = "data.frame",
 row.names = c(NA, -5L))

california.trees <- structure(list(group = c("A", "A", "B", "B", "C"), 
 california.redwoods = c(25L, 
11L, 90L, 77L, 90L), california.oaks = c(50L, 33L, 5L, 3L, 35L
)), .Names = c("group", "california.redwoods", "california.oaks"
), class = "data.frame", row.names = c(NA, -5L))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为列名传递变量? 的相关文章

  • randomForest 包在删除一个预测类时的奇怪行为

    我正在运行一个随机森林模型 它产生的结果从统计角度来看对我来说完全没有意义 因此我确信有些东西mustrandomForest 包的代码出现错误 至少在模型的本次迭代中 预测 左侧变量是具有 3 种可能结果的政党 ID 民主党 独立党 共和
  • 如何在 R 中合并同名列表中的数据框?

    我有一个包含很多数据框的列表 如果它们具有相同的名称 我想合并它们 即合并所有具有相同名称 a 和 b 的数据框 像这样 a lt aaaaa b lt bbbbb c lt ccccc g lt list df1 lt data fram
  • R中的字典数据结构

    在 R 中 我有 例如 gt foo lt list a 1 b 2 c 3 如果我输入foo I get a 1 1 b 1 2 c 1 3 我怎样才能看透foo仅获取 键 列表 在这种情况下 a b c R 列表可以具有命名元素 因此可
  • purrr::可能函数可能无法与map2_chr函数一起使用

    我怀疑这是 purrr 包中的错误 但想先在 StackOverflow 中检查我的逻辑 在我看来 possibly功能在内部不起作用map2 chr功能 我正在使用 purrr 版本 0 2 5 考虑这个例子 library dplyr
  • 如何在 data.table 中分组后使用条件计算行数

    我有以下数据框 dat lt read csv s1 s2 v1 v2 a b 10 20 a b 22 NA a b 13 33 c d 3 NA c d 4 5 NA c d 10 20 dat gt A tibble 6 x 4 gt
  • 实现 XGboost 自定义目标函数

    我正在尝试使用 XGboost 实现自定义目标函数 在 R 中 但我也使用 python 所以有关 python 的任何反馈也很好 我创建了一个返回梯度和粗麻布的函数 它工作正常 但是当我尝试运行 xgb train 时它不起作用 然后 我
  • 如何按时间间隔匹配数据帧?

    这是我从数据记录器导入原始数据时经常出现的问题 温度记录仪设置为每十分钟记录一次温度 单独的气体记录仪设置为记录最后十分钟间隔内使用的气体 我想将这两个记录器的数据合并到一个数据框中进行绘图和分析 但时间并不完全一致 我希望每十分钟的时间段
  • picker输入字体或背景颜色

    我在闪亮的仪表板中使用 pickerInput 这很好 除了一个问题 背景颜色和字体颜色太相似 使得过滤器选择难以阅读 有什么办法可以改变背景或字体颜色吗 如果可能的话 我想继续使用 pickerInput 但如果有一个带有 selectI
  • 如何纠正 data.frame 上的字符编码

    我有一个像这样的数据框 data names lt data frame DATA c 1 5 rownames data names lt c IV xc1N JOS xc9 LUC xcdA RAM xd3N TO xd1O data
  • `dplyr::_join` 函数的命名向量“by”参数[重复]

    这个问题在这里已经有答案了 我正在写一个函数dplyr join两个数据框by不同的列 第一个数据帧的列名称动态指定为函数参数 我相信我需要使用rlang准引用 元编程 但未能找到可行的解决方案 我很感激任何建议 library dplyr
  • R Shiny:如何将无功值从闪亮模块返回到主服务器功能?

    我有一个简单的玩具示例 它使用 add removeBtn 模块在 第一个 模块中添加和删除 UI 我需要跟踪单击 添加 删除 的次数 如果我不使用模块 这很容易 但我试图在嵌套模块的上下文中执行此操作 代码如下 但基本上 我似乎无法访问主
  • 更新 R6 对象实例中的方法定义

    如何更新 R6 类实例的方法定义 正如我所期望的 S3 使用当前的方法定义 对于 R5 参考类 我可以使用 myInstance myInstance copy 在 R6 中 我尝试了 myInstance myInstance clone
  • sapply - 保留列名称

    我试图总结数据集中许多不同列 变量 的平均值 标准差等 我已经编写了自己的汇总函数 以准确返回我需要和正在使用的内容sapply立即将此函数应用于所有变量 它工作正常 但是返回的数据帧没有列名 我似乎甚至无法使用列号引用重命名它们 也就是说
  • 声明时初始化和构造函数中初始化之间的区别[重复]

    这个问题在这里已经有答案了 以下两者有什么区别 哪个更优选 public class foo int i 2 public class foo int i foo i 2 在您的示例中 行为语义没有区别 在Java中 所有实例字段初始值设定
  • 闪亮的应用程序包:css 和所有 www/ 目录内容

    我正在尝试将 Shiny 应用程序转换为 R 包 但我在处理有关 www 目录以及 松散 文件的所有问题时遇到了问题 我闪亮的应用程序运行得很好 但是当我尝试 打包它 时 它不起作用 我闪亮的应用程序目录 my shiny app R ut
  • 在r中的某个阈值处破坏 cumsum() 函数

    例如我有以下代码 cumsum 1 100 我想打破它 如果一个元素 i 1 大于3000 我怎样才能做到这一点 因此 而不是这个结果 1 1 3 6 10 15 21 28 36 45 55 66 78 91 105 120 136 15
  • 在 Shiny 中显示反应式 htmlTable 表格

    我正在制作我的第一个 Shiny 应用程序 但找不到任何有关如何显示使用 htmlTable 包创建的表格的示例 我基本上想在按下按钮时创建一个表格并显示它 Shiny 显示 html 代码而不是表格 我不知道用什么替换服务器部分中的 re
  • R在Windows平台Rstudio上打印data.frames中的UTF-8代码

    当数据框中存在UTF 8字符时 将无法正常显示 例如 以下内容是正确的 gt U6731 1 朱 但是当我将其放入数据框中并打印出来时 它是 gt data frame x U6731 x 1
  • 增加雷达图中长轴标签的空间

    我想创建一个雷达图ggirahExtra ggRadar 问题是我的标签很长并且被剪掉了 我想我可以通过添加在标签和绘图之间创建更多空间margin margin 0 0 2 0 cm to element text in axis tex
  • 当将遗传算法与 lme4 一起使用时,glmulti 无限期运行

    我在 R 中使用 glmulti 进行模型平均 我的模型中有大约 10 个变量 使得详尽的筛选不切实际 因此我需要使用遗传算法 GA 调用 method g 我需要包含随机效应 因此我使用 glmulti 作为 lme4 的包装器 此处提供

随机推荐

  • 在python中将多个Excel文件(xlsx)附加在一起

    import pandas as pd import os import glob all data pd DataFrame for f in glob glob output test xlsx df pd read excel f a
  • d3:绘制累积图

    Does d3 https d3js org 有内置方法将数据集绘制为累积图吗 例如 如果 y 值为 2 4 2 2 我希望它们实际上被绘制为 2 6 8 10 d3 有办法做到这一点还是我必须遍历数据集并手动执行此操作 你可以检查http
  • git clone 在不同服务器上产生不同的权限

    在一台服务器上执行 git clone git github com blasto333 PHP Point Of Sale git 时 文件权限是 我显示一个文件 但所有文件都是这样 rw r r 1 chrism chrism 3297
  • 如何将参数传递给角度2中的POST方法

    我想将参数传递给 Angular 2 中的 POST 方法 但我使用时它不起作用params new httpParams set 但它没有起作用 我也尝试过params new httpParams set 和 headers然后它也不起
  • 无法查看.Net Core bitbucket pipelines 测试结果

    我终于设法通过以下命令在 bitbucket 管道中制作测试报告 dotnet test MyTests logger trx LogFileName test reports results xml 构建拆解 说 Found matchi
  • 查询优化和 API 限制

    我们正在跟踪许多客户的 Facebook 页面和帖子指标 根据开发人员见解控制台 见解 gt 开发人员 gt 活动和错误 该文档对 Graph API 的限制和限制有些不清楚 我们只是想确保我们对可用的资源有正确的理解 我们正在努力优化我们
  • 在 Windows 10 上禁用 NPM run dev 不编译资产并为用户提供错误通知

    我最近重新安装了 Windows 10 操作系统 运行时npm install command npm 安装正确 然而 在运行npm run watch命令或npm run dev命令 资产未编译 显示以下消息 通知被禁用原因 Disabl
  • LDAP:过滤多个UID

    我正在尝试为一个团队设置 mediawiki 并且希望仅对一组用户进行 LDAP 身份验证 我知道我可以提出组 LDAP 身份验证 但是有没有一种快捷方式可以仅过滤一组 uid 进行身份验证 您可以使用的 LDAP 搜索过滤器是 uid a
  • data.table:如何将字符向量传递给函数 get data.table 以将其内容视为列名?

    这是一个数据表 library data table DT lt data table airquality 这个例子产生了我想要的输出 DT New Ozone log Ozone New Wind log Wind 我怎样才能写一个函数
  • 在猫鼬中进行条件查找

    我有两个收藏 文章和书签 articles id 5faa889ade5e0a6326a873d3 name article 1 id 5faa889ade5e0a6326a873d name article 2 书签 id 5faa889
  • 在 eclipse Oxygen 中更改 PHP 语言库

    面向 PHP 开发人员的 Eclipse 版本 氧气释放 4 7 0 内部版本号 20170620 1800 我怎样才能改变PHP Language Library到 PHP 7 参见下面的屏幕 该项目源自先前的 eclipse 版本 已导
  • 使用过多内存从 {raster} 包中提取

    我一直在使用extract函数从raster包使用 shapefile 定义的区域从光栅文件中提取数据 但是 我对该过程现在所需的内存量存在问题 我确实有大量 shapefile 1000 光栅文件很大 1 6gb 我的流程是 shp lt
  • 如何从命令行界面将字符串作为 stdin 传递给 python 脚本

    目前 我正在使用以下命令来执行此操作 python scriptName py
  • 反转 gcc 输出的顺序

    我想颠倒 gcc 在我的程序中发现的错误的顺序 为什么 读取最后一行的第一个错误并避免滚动到第一行 我在 gcc cat tail 和 head 手册上搜索了类似 reverse 的命令 但没有结果 所以 我想要一个以相反顺序打印标准输入的
  • 带有 RVM 的 Ruby 1.9.3 IRB 中的 Unicode 字符

    Update 我发现几乎完全正确类似的问题 https stackoverflow com q 4590725 80851 但它的先决条件略有不同 因此没有多大帮助 Given MacOS 狮子 10 7 3 RVM 1 14 2 红宝石
  • Flutter 文本字段仅允许用户插入给定范围内的数字

    我会强制只插入 1 20 之间的值 如果用户输入 2 没问题 但如果用户在 2 21 之后输入 1 则文本字段将不允许在 2 之后输入 1 是否有任何正则表达式 我尝试过这样但它只允许数字 inputFormatters Filtering
  • dart 中可以有私有构造函数吗?

    我可以在 TypeScript 中执行类似以下操作 class Foo private constructor so this constructor只能从类本身内部访问 如何在 Dart 中实现同样的功能 只需创建一个以以下开头的命名构造
  • Python:itertools.islice 不在循环中工作

    我有这样的代码 opened file f goto line num lines Total number of lines while not found line str next itertools islice f goto li
  • 使用 requirejs 加载 firebase js 时出错

    我使用 RequireJS 加载 Firebase js 库 如下所示 require firebase app firebase storage function firebase firebase initializeApp fireb
  • 为列名传递变量?

    例如 假设您有一个应用了某些 DPLYR 函数的函数 但您不能期望传递给该函数的数据集具有相同的列名称 举一个简单的例子来说明我的意思 假设你有一个数据框 arizona trees arizona trees group arizona