Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >可以使非标准评估在dplyr中用于filter_和count_,而不是distinct_。

可以使非标准评估在dplyr中用于filter_和count_,而不是distinct_。
EN

Stack Overflow用户
提问于 2016-12-16 09:09:21
回答 3查看 409关注 0票数 3

我正在尝试编写一个函数,它使用dplyr来计数z的所有唯一值。当我的变量实际名为z时,我的函数工作得很好。但是,如果变量名为x,则会出现一个错误(下面的代码)。

代码语言:javascript
运行
AI代码解释
复制
test.data<-data.frame(y=c(1:10),
                  x=c(letters[1:10]))
test.data$x<-as.character(test.data$x)
obsfunction<-function(z,y,data){
filter_(data,
          !is.na(deparse(substitute(y))))%>%
    distinct_(., deparse(substitute(z)))%>% #the line that breaks it
    count_(.)
}
obsfunction(z=x,y,data=test.data)

因此,上面的代码不起作用,并给出了以下错误:

代码语言:javascript
运行
AI代码解释
复制
 >Error in eval(substitute(expr), envir, enclos) : unknown column 'z'

在函数中将z更改为x(或将x重命名为z)使其工作,但我不想重新命名所有东西,特别是考虑到y具有不同的名称。

我已经尝试过按照格列奈特这个问题这个问题使用lazyeval::interp和这个问题()。

代码语言:javascript
运行
AI代码解释
复制
distinct_(lazyeval::interp(as.name(z)))%>%
>Error in as.name(z) : object 'x' not found 

distinct_(quote(z))%>%
>Error in eval(substitute(expr), envir, enclos) : unknown column 'z' 

我遗漏了什么?如何使z接受x作为列名?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-12-16 10:40:01

由于dplyr标准评估理解字符串,我尝试了下面的代码,并使用附加的测试数据,这似乎是可行的。首先提取变量名称,然后使用字符串构造表达式:

代码语言:javascript
运行
AI代码解释
复制
test.data<-data.frame(y=c(1:10),
                      x=c(letters[1:10]))
test.data$x<-as.character(test.data$x)

f <- function(z, y, data){
    z <- deparse(substitute(z))
    y <- deparse(substitute(y))
    res <- data %>% filter_(
        paste('!is.na(', y, ')', sep = '')) %>%
        distinct_(z) %>%
        count_(.)
}


x <- f(z = x, y, test.data)
# # A tibble: 1 × 1
#       n
# <int>
# 1    10



test.data <- data.frame(
    y=c(1:4, NA, NA, 7:10),
    x=c(letters[c(1:8, 8, 8)]),
    stringsAsFactors = F)

x <- f(z = x, y, test.data)
# # A tibble: 1 × 1
#       n
# <int>
# 1     6
票数 3
EN

Stack Overflow用户

发布于 2016-12-16 10:21:16

您可以使用match.call捕获函数参数,并在传递到dplyr函数之前将它们转换为字符:

代码语言:javascript
运行
AI代码解释
复制
obsfunction<-function(z, y, data){
    cl = match.call()
    y = as.character(cl['y'])
    z = as.character(cl['z'])

    data %>% filter_(paste('!is.na(', y, ')', sep = '')) %>%
             distinct_(z) %>%
             count_(.)
}

obsfunction(z = x, y = y, data = test.data)

# A tibble: 1 × 1
#      n
#  <int>
#1    10

obsfunction(x, y, test.data)

# A tibble: 1 × 1
#      n
#  <int>
#1    10
票数 2
EN

Stack Overflow用户

发布于 2016-12-16 12:37:45

另一个lazyeval/dplyr变体,变量作为公式传递,而f_interp用传递给它的公式替换uq(x),类似于deparse(substitute(x))

代码语言:javascript
运行
AI代码解释
复制
library(dplyr)
library(lazyeval)

test.data<-data.frame(y=c(1:10),
                  x=c(letters[1:10]))
test.data$x<-as.character(test.data$x)


obsfunction<-function(z, y, data){
  data %>% filter_(f_interp(~!is.na(uq(y)))) %>%
    distinct_(f_interp(~uq(z))) %>% count()
}

obsfunction(z=~x,~y,data=test.data)

 #A tibble: 1 × 1
 #     n
 #  <int>
 #1    10

test.data.NA <- data.frame(
  y=c(1:4, NA, NA, 7:10),
  x=c(letters[c(1:8, 8, 8)]),
  stringsAsFactors = FALSE)


obsfunction(z=~x,~y,data=test.data.NA)
 # # A tibble: 1 × 1
 #        n
 #      <int>
 # 1      6
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41189234

复制
相关文章
SharedWorker 演示
---- 作用: 通过SharedWorker可以在同源内的不同窗口之间传递信息 构建worker脚本 let pool = []; onconnect = function (e) { let port = e.ports[0]; pool.push(port); port.onmessage = function (e) { pool.forEach((v) => { v != port &amp;&amp; v.postMessage(e.data);
前端小鑫同学
2022/12/25
8830
SharedWorker 演示
[Java 开发利器Lombok] 常用注解演示
在以往的对象模型编码时,我们需要写一大堆的get/set以及不同的构造函数等。Lombok为我们提供了一个非常好的插件形式。 在大多数的项目中,只需要使用到以下集中Annotation就足够了,如果需要查看更多的选项,请参考:传送门
Isaac Zhang
2019/09/10
7720
[Java 开发利器Lombok] 常用注解演示
ManualResetEvent使用演示
ManualResetEvent 允许线程通过发信号互相通信。通常,此通信涉及一个线程在其他线程进行之前必须完成的任务。 当一个线程开始一个活动(此活动必须完成后,其他线程才能开始)时,它调用 Reset 以将 ManualResetEvent 置于非终止状态。此线程可被视为控制 ManualResetEvent。调用 ManualResetEvent 上的 WaitOne 的线程将阻止,并等待信号。当控制线程完成活动时,它调用 Set 以发出等待线程可以继续进行的信号。并释放所有等待线程。 一旦它被终止,ManualResetEvent 将保持终止状态(即对 WaitOne 的调用的线程将立即返回,并不阻塞),直到它被手动重置。 可以通过将布尔值传递给构造函数来控制 ManualResetEvent 的初始状态,如果初始状态处于终止状态,为 true;否则为 false。
全栈程序员站长
2022/09/09
5140
死锁案例演示
两个或两个以上进程在执行过程中,因为争夺资源而造成一种互相等待的现象,如果没有外力干涉,它们无法再执行下去。
别团等shy哥发育
2023/02/25
4580
死锁案例演示
HTML5
定义:HTML5 定义了 HTML 标准的最新版本,是对 HTML 的第五次重大修改,号称下一代的 HTML
Qwe7
2022/05/21
3.4K0
HTML5
JS 里拖拽三事件, onmousedown onmousemove onmouseup 是实现交互性效果,根据鼠标的移动位置让标签元素联动
jinghong
2020/05/12
4.3K0
HTML5
HTML指的是HTML 4.01, XHTML是HTML的过渡版本,XHTML是XML风格的HTML 4.01。而HTML 5指的是下一代的HTML,也就是HTML 4.01的升级版。
Qwe7
2022/05/18
1.9K0
html5
blockquote : 引用大段的段落解释 q : 引用小段的短语解释 abbr : 缩写或首字母缩略词 address : 引用文档地址信息 cite : 引用著作的标题
用户9603238
2022/03/31
5.5K0
HTML5
1、HTML5是什么? HTML5是超文本标记语言的第五次重大修改,2014年10月29日标准规范制定完成。 HTML5的设计目的是为了在移动设备上支持多媒体。新的语法特征被引进以支持这一点,如video、audio和canvas标记。HTML5还引进了新的功能,可以真正改变用户与文档的交互方式,包括: 1. 新的解析规则增强了灵活性 2. 新属性 3. 淘汰过时的或冗余的属性 4. 一个HTML5文档到另一个文档间的拖放功能 5. 离线编辑 6. 信息传递的增强 7. 详细的解析
小胖
2018/06/27
4.7K0
HTML5
更多属性:width、height(只设置一个会保持原图比例,两个都设置自定义图片比例)
roydonGuo
2022/11/02
3.3K0
HTML5
Html5 学习系列(一)认识HTML5
        在讲什么是Html5之前得先了解两个组织;WHATWG :网页超文本技术工作小组(英语:Web Hypertext Application Technology Working Group,缩写为WHATWG),是一个以推动网络 HTML 5 标准为目的而成立的组织。在2004年,由Opera、Mozilla基金会和苹果这些浏览器厂商和一些相关团体形成的一个松散的、非正式的协作组织,这些团体希望发展一些新的技术,从而开发人员可以在互联网上编写并部署应用。 另外一个就是大家熟悉的W3C :万维网联盟(World Wide Web Consortium,W3C),又称W3C理事会,它主要是为解决web应用中不同平台、技术和开发者带来的不兼容问题,保障Web信息的顺利和完整流通,万维网联盟制定了一系列标准并督促Web应用开发者和内容提供者遵循这些标准。标准的内容包括使用语言的规范,开发中使用的导则和解释引擎的行为等等。W3C也制定了包括XML和CSS等的众多影响深远的标准规范。
老马
2022/05/10
2.5K0
Discuz分页方法演示
if(!defined('IN_DISCUZ') || !defined('IN_DISCUZ')) {     exit('Access Denied'); }     shownav('yuyue', 'menu_yuyue_list');     showformheader('article&operation=trash');     showtableheader('预约列表');     showsubtitle(array('姓名', '电话', '时间','操作'));     //列表开
96php.cn
2018/04/28
1.3K0
信号(三)- 示例演示
Main、Producer 和 Consumer 这三个类中的每一个都有自己的 Run 方法,最好在各自的终端窗口中运行它们。每次运行时,它都会显示它为日志生成的消息。一旦用户通过提供它正在等待的输入来响应 Main 类,Main 的 Run 方法将终止删除信号量。然后,用户可以通过键入命令查看所有进程的合并日志文件的显示
用户7741497
2022/08/03
7190
HTML5 Video Creator:HTML5视频制作软件
HTML5 Video Creator是一款强大的HTML5视频制作软件,使用它可创建在每个平台上的每个浏览器中运行的可部署HTML5视频,使用非常简单,只需拖放、设置、导出即可!
啾咪啾咪
2022/09/16
3.3K0
html5 progress
<section> <h2>进度 Progress</h2> <p>进度: <progress id="p" value="0" max=100><span>0</span>%</progress></p> <script> window.onload=function(){ va
2021/11/08
2.7K0
html5 progress
HTML5拖拽
图片自带拖拽功能 其他元素可设置draggable属性:draggable :true 拖拽元素(被拖拽的元素)事件 :
踏浪
2019/07/31
3.9K0
html5标签
什么是html5? 仅仅是狭义的概念。h5草案前身叫做web application 由WHATWG组织编写,在2007年提交到了w3c,w3c起名叫做HTML5。 广义上:新一代开发web富客户端
河湾欢儿
2018/09/06
3.7K0
Java演示死锁代码
死锁代码 public class DeadLock {     final Object lockA = new Object();     final Object lockB = new Object();     public static void main(String[] args) {         DeadLock demo = new DeadLock();         demo.startLock();     }     public void startLock() {
黑泽君
2018/10/11
6920
Java演示死锁代码
Sass安装演示
安装好 Ruby 后我们打开 cmd 输入 gem install sass 就可以了。
小蓝枣
2020/09/25
6360
Sass安装演示
HASH分区演示案例
在RANGE和LIST分区中,我们必须明确指定一个给定的区间或列值集合,来指定哪些记录进入哪些分区;
用户1503405
2021/10/06
6130

相似问题

HTML5图像演示

10

HTML5历史API演示

25

使用HTML5演示如何编写字符

15

本地存储-带代码的HTML5演示

40

如何在使用HTML5中进行演示?

31
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档