使用 dplyr::filter 创建 R 函数问题

2024-06-28

我查看了其他答案,但找不到使下面的代码起作用的解决方案。基本上,我正在创建一个函数inner_join两个数据框和filter基于函数中输入的列。

问题是filter部分功能不起作用。但是,如果我将过滤器从函数中取出并附加它,它就会起作用mydiff("a") %>% filter(a.x != a.y)

任何建议都有帮助。

请注意,我是函数输入用引号引起来

library(dplyr)

# fake data
df1<- tibble(id = seq(4,19,2), 
             a = c("a","b","c","d","e","f","g","h"), 
             b = c(rep("foo",3), rep("bar",5)))
df2<- tibble(id = seq(10, 20, 1), 
             a = c("d","a", "e","f","k","m","g","i","h", "a", "b"),
             b = c(rep("bar", 7), rep("foo",4)))

# What I am trying to do
dplyr::inner_join(df1, df2, by = "id") %>% select(id, b.x, b.y) %>% filter(b.x!=b.y)

#> # A tibble: 1 x 3
#>      id b.x   b.y  
#>   <dbl> <chr> <chr>
#> 1    18 bar   foo

# creating a function so that I can filter by difference in column if I have more columns
mydiff <- function(filteron, df_1 = df1, df_2 = df2){
  require(dplyr, warn.conflicts = F)
  col_1 = paste0(quo_name(filteron), "x")
  col_2 = paste0(quo_name(filteron), "y")
  my_df<- inner_join(df_1, df_2, by = "id", suffix = c("x", "y"))
  my_df %>% select(id, col_1, col_2) %>% filter(col_1 != col_2)
}

# the filter part is not working as expected. 
# There is no difference whether i pipe filter or leave it out
mydiff("a")

#> # A tibble: 5 x 3
#>      id ax    ay   
#>   <dbl> <chr> <chr>
#> 1    10 d     d    
#> 2    12 e     e    
#> 3    14 f     k    
#> 4    16 g     g    
#> 5    18 h     h

它在你原来的功能中不起作用的原因是col_1 was string but dplyr::filter()LHS 的预期“未加引号”输入变量。因此,您需要首先转换col_1变量使用sym()然后取消里面的引号filter using !!(嘭嘭)。

rlang有非常好的功能qq_show显示引用/取消引用实际发生的情况(参见下面的输出)

另请参阅类似的question https://stackoverflow.com/q/51738267/

library(rlang)
library(dplyr)

# creating a function that can take either string or symbol as input
mydiff <- function(filteron, df_1 = df1, df_2 = df2) {

  col_1 <- paste0(quo_name(enquo(filteron)), "x")
  col_2 <- paste0(quo_name(enquo(filteron)), "y")

  my_df <- inner_join(df_1, df_2, by = "id", suffix = c("x", "y"))

  cat('\nwithout sym and unquote\n')
  qq_show(col_1 != col_2)

  cat('\nwith sym and unquote\n')
  qq_show(!!sym(col_1) != !!sym(col_2))
  cat('\n')

  my_df %>% 
    select(id, col_1, col_2) %>% 
    filter(!!sym(col_1) != !!sym(col_2))
}

### testing: filteron as a string
mydiff("a")
#> 
#> without sym and unquote
#> col_1 != col_2
#> 
#> with sym and unquote
#> ax != ay
#> 
#> # A tibble: 1 x 3
#>      id ax    ay   
#>   <dbl> <chr> <chr>
#> 1    14 f     k

### testing: filteron as a symbol
mydiff(a)
#> 
#> without sym and unquote
#> col_1 != col_2
#> 
#> with sym and unquote
#> ax != ay
#>  
#> # A tibble: 1 x 3
#>      id ax    ay   
#>   <dbl> <chr> <chr>
#> 1    14 f     k

Created on 2018-09-28 by the reprex package https://reprex.tidyverse.org (v0.2.1.9000)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 dplyr::filter 创建 R 函数问题 的相关文章

随机推荐

  • 简单的带宽/延迟测试来评估用户体验

    我编写基于网络的应用程序 性能显然是一个关键因素 虽然数据库加载和页面渲染时间是我可以控制的 但用户的互联网连接却无法控制 我正在寻找的是一种指示用户拥有何种类型的连接的方法 类似于网站角落里的红绿灯 向用户显示他们与网站的连接类型 从而表
  • FancyBox 调整宽度

    我可以使用以下命令调整高度 fancybox resize 部分 但宽度不会根据新内容更新 想法 来自fancybox API 文档 http fancybox net api fancybox resize 自动调整 FancyBox 的
  • 从 http.get() 加载的 JSON 数据在我的 Angular 2 模板中未定义

    我正在尝试读取本地 json 文件并将其解析为我制作的具有相同属性的类 当我尝试从类中读取时 它给出错误 指出该类为 null 或未定义 我有一个文件hall ts看起来像这样 import Item from item item expo
  • 如何在不安装material-ui的情况下安装Material-UI Docs?

    目前要在本地安装和运行 Material ui 文档 需要两个npm install 一个在material ui 中 另一个在material ui docs 中 cd
  • 将arm_compute::Image 转换为cv::Mat

    我有很多基于 open cv 的代码 但是 Arm 计算库可以通过多种方式提高性能 因此我想将一些 arm 计算库代码集成到我的项目中 有没有人尝试过在两个相应的图像结构之间进行转换 如果是这样 你做了什么 或者有没有一种方法可以共享指向底
  • 如何在Spring DataSourceTransactionManager管理的每个事务中执行自定义sql代码?

    考虑一下这样的情况 我们有大量由 Spring 管理的 java DAO 类 这些 bean 中定义的每个方法都在 Spring 的数据源事务中执行 SQL 代码 由方法上的注释定义 现在我们需要在上述方法的目标执行之前运行一些自定义代码
  • Python将一个变量内的多个列表合并到一个列表中[重复]

    这个问题在这里已经有答案了 我很难将多个列表放入一个列表中 因为它们都在一个变量内 这是一个例子 我拥有的 a 1 3 3 我想要的是 a 1 3 3 如何使用 Python 3 x 解决这个问题 EDIT 这是我正在处理的代码 from
  • 如何退格或删除?

    在 Windows 10 中 当我通过 Windows 上的 Kitematic 中的容器启动 MS PowerShell 进行 ssh 时 我注意到我无法退格或删除 而是得到 H 表示退格 而不是实际删除前一个字符 我错过了什么吗 接受的
  • (键,值)对结构的内存分配,并从注册表中读取

    我想制作一个程序 它从 Windows 注册表中收集一些信息 然后将其保存到文件中 但是我在收集信息时遇到了问题 我想将数组存储在结构中 我的问题是在初始化结构后指定数组的大小 typedef struct RESULTSKEY char
  • 什么时候需要浅拷贝(而不是深拷贝)?

    有人可以举一个需要浅拷贝的情况的例子吗 请注意 在某些情况下 浅复制和深复制是相同的 当对象对其任何子变量没有所有权时 就会发生这种情况 也就是说 所有子变量都是聚合的 http en wikipedia org wiki Object c
  • 级联的反向等效项是什么?

    我正在编写一个小型音乐数据库 我学习 SQL 已经有很长一段时间了 我一直想尝试一下 Django 但有一件事我无法理解 现在 我的模型仅包含两个类 Album and Song Song有一个外键指向它所属的相册 现在如果我删除它Albu
  • 为什么在 VS2008/Casini 中启动调试时 Application_Init 会触发两次?

    为什么在 VS2008 Casini 中启动调试时 Application Init 会触发两次 是的 它发生在 global asax 中 虽然看起来相当随机 但只偶尔发生一次 我假设您引用的是 ASP NET MVC 应用程序中的 Gl
  • 使用 deflater 压缩/解压缩字符串

    我想压缩 解压缩和序列化 反序列化字符串内容 我正在使用以下两个静态函数 Compress data based on the link Deflater param pToCompress input byte array return
  • Compass 和 SASS:没有编译错误

    我现在已经厌倦了这个问题 为了让这件事继续下去 我已经被推迟了很多次 我觉得这是我解决问题的最后一次尝试 开始 我安装指南针 sudo gem update system sudo gem install compass 我创建我的测试项目
  • rspec Rails 测试:如何强制 ActiveJob 作业内联运行某些测试?

    我希望我的后台作业能够内联运行某些标记的测试 我可以通过包装测试来做到这一点perform enqueued do但我希望能够用元数据标记它们 并且如果可能的话 它会自动发生 我尝试过以下方法 it does everything in t
  • iPhone 4后台定位服务问题

    我正在研究 iPhone 4 SDK 中新的后台位置服务选项 它允许应用程序在后台运行并从设备接收位置更新 提供了两种方法 一种是电池密集型模式 可以持续获取位置更新 第二种推荐的方法是在发生 重大位置变化 时发送应用程序位置更新 有谁知道
  • 我可以将 HTMLUnit 配置为仅运行特定的 javascript 进程而不是整个进程吗?

    我希望从一组格式非常相似的网页中收集信息 我需要一些在打开后由 Javascript 加载到页面上的信息 HTMLUnit 似乎是执行此操作的一个非常常见的工具 所以这就是我正在使用的工具 不幸的是 它非常慢 这是我在很多论坛上看到的抱怨
  • 在 iOS 中使用 webView 集成 Instagram 失败

    在我的应用程序中 我使用 webView 进行 Instagram 身份验证 首先它显示 Instagram 登录屏幕 成功登录后我正在获取 accessToken 然后我使用 accessToken 获取其他详细信息 这是我在 viewD
  • ggplot2 黑白配色方案的建议

    我正在使用 ggplot2 生成许多结构如下的图表 有没有一种简单的方法可以制作出黑白效果很好的东西 我确实读过这个question https stackoverflow com questions 2895319 how to add
  • 使用 dplyr::filter 创建 R 函数问题

    我查看了其他答案 但找不到使下面的代码起作用的解决方案 基本上 我正在创建一个函数inner join两个数据框和filter基于函数中输入的列 问题是filter部分功能不起作用 但是 如果我将过滤器从函数中取出并附加它 它就会起作用my