当逻辑条件意味着不应评估输出时,为什么 dplyr 会在此嵌套 if_else 中出错?

2023-12-01

我有一个嵌套的if_else里面的声明mutate。在我的示例数据框中:

tmp_df2 <- data.frame(a = c(1,1,2), b = c(T,F,T), c = c(1,2,3))

  a     b c
1 1  TRUE 1
2 1 FALSE 2
3 2  TRUE 3

我希望分组依据a然后根据组中是否有一行或两行来执行操作。我本以为这是嵌套的if_else就足够了:

tmp_df2 %>%
    group_by(a) %>%
    mutate(tmp_check = n() == 1) %>%
    mutate(d = if_else(tmp_check, # check for number of entries in group
                       0,
                       if_else(b, sum(c)/c[b == T], sum(c)/c[which(b != T)])
    )
    )

但这会引发错误:

Error in eval(substitute(expr), envir, enclos) : 
  `false` is length 2 not 1 or 1.

该示例的设置方式,当第一个if_else(n() == 1)条件评估为 true,则返回一个元素,但当其评估为 false 时,则返回一个具有两个元素的向量,这就是我假设导致错误的原因。然而,从逻辑上讲,这种说法对我来说似乎是合理的。

以下两个语句产生(期望的)结果:

> tmp_df2 %>%
+     group_by(a) %>%
+     mutate(d = ifelse(rep(n() == 1, n()), # avoid undesired recycling
+                        0,
+                        if_else(b, sum(c)/c[b == T], sum(c)/c[which(b != T)])
+     )
+     )
Source: local data frame [3 x 4]
Groups: a [2]

      a     b     c     d
  <dbl> <lgl> <dbl> <dbl>
1     1  TRUE     1   3.0
2     1 FALSE     2   1.5
3     2  TRUE     3   0.0

或者只是过滤以便只留下包含两行的组:

> tmp_df2 %>%
+     group_by(a) %>%
+     filter(n() == 2) %>%
+     mutate(d = if_else(b, sum(c)/c[b == T], sum(c)/c[which(b != T)]))
Source: local data frame [2 x 4]
Groups: a [1]

      a     b     c     d
  <dbl> <lgl> <dbl> <dbl>
1     1  TRUE     1   3.0
2     1 FALSE     2   1.5

我有三个问题。

  1. dplyr 如何知道由于逻辑条件而不应计算的第二个输出无效?

  2. 如何在 dplyr 中获得所需的行为(不使用ifelse)?

EDIT正如答案中所述,要么没有临时的tmp_check列并使用if ... else构造,或使用以下有效但会产生警告的代码:

library(dplyr)
tmp_df2 %>%
    group_by(a) %>%
    mutate(tmp_check = n() == 1) %>%
    mutate(d = if (tmp_check)  # check for number of entries in group
                       0 else
                       if_else(b, sum(c)/c[b == T], sum(c)/c[which(b != T)])
    )

dplyr“知道”因为if_else检查用于 True 和 False 情况的值。这在?if_else,消息来源告诉我们它是如何完成的:

if_else
# function (condition, true, false, missing = NULL) 
# {
#     if (!is.logical(condition)) {
#         stop("`condition` must be logical", call. = FALSE)
#     }
#     out <- true[rep(NA_integer_, length(condition))]
#     out <- replace_with(out, condition & !is.na(condition), true, 
#         "`true`")
#     out <- replace_with(out, !condition & !is.na(condition), 
#         false, "`false`")
#     out <- replace_with(out, is.na(condition), missing, "`missing`")
#     out
# }
# <environment: namespace:dplyr>

检查来源replace_with:

dplyr:::replace_with
# function (x, i, val, name) 
# {
#     if (is.null(val)) {
#         return(x)
#     }
#     check_length(val, x, name)
#     check_type(val, x, name)
#     check_class(val, x, name)
#     if (length(val) == 1L) {
#         x[i] <- val
#     }
#     else {
#         x[i] <- val[i]
#     }
#     x
# }
# <environment: namespace:dplyr>

因此,会检查 True 和 False 情况下的值的长度。

为了获得您想要的行为,您可以使用if ... else, 正如另一位 SO 用户所建议的在你之前的问题中:

tmp_df2 %>%
    group_by(a) %>%
    mutate(d = if (n() == 1) 0 else if_else(b, sum(c)/c[b == T], sum(c)/c[which(b != T)])
    )
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当逻辑条件意味着不应评估输出时,为什么 dplyr 会在此嵌套 if_else 中出错? 的相关文章

  • dplyr:带引号变量名的 mutate 的标准评估

    我将如何使用mutate 我的假设是我正在寻找标准评价就我而言 因此mutate 但我对此并不完全有信心 当使用接受变量名列表的函数时 如下所示 createSum function data variableNames data gt m
  • R 带有列和行的分面 qqplots

    我需要使用按行和列的构面创建 qqplot 我了解如何用列和行绘制分面图 但我不确定如何设置我的数据 最终 我想按列和行对数据集进行分组 然后按升序对 建模 结果和 观察到 结果进行排序 同时添加带有 行 组的列和带有 列 组的列 我一直在
  • 关于子组的新列和另一列中的百分比范围

    我有一个如下所示的示例 df df test lt data frame Group Name c Group1 Group2 Group1 Group2 Group2 Group2 Group1 Sub group name c A A
  • 根据 R 中的字符串模式选择行

    假设我有以下数据 df lt data frame name c TO for Turnover for people HC people Hello world beenie man apple pears TO is number c
  • 使用 roxygen2 导入两个同名函数

    我是 CRAN 包的维护者 在加载时收到以下消息 checking whether package qdap can be installed 10s 10s WARNING Found the following significant
  • 正则表达式提取美国邮政编码,但不提取假代码

    使用 XML 包和 XPath 从网站上抓取地址 有时我只能得到一个嵌入了我想要的邮政编码的字符串 提取邮政编码很简单 但有时会显示其他五位数字的字符串 以下是 df 中问题的一些变体 zips lt data frame id seq 1
  • R:(中缀)运算符的两个定义之间的冲突:如何指定包?

    在 R 中 每当两个包定义相同的函数时 很容易指定要使用哪个包pkg foo 但是 当冲突的功能是一个时 你该怎么办 infix运算符 即使用定义 举个例子 两者ggplot2 and crayon define 有没有一种方法可以让我默认
  • R正则表达式获取第二个下划线之前的所有文本

    s lt 1 343 43Hello 2 323 14 fdh 99H 在 R 中 我想使用正则表达式来获取第二个下划线之前的子字符串 如何使用一个正则表达式来完成此操作 另一种方法是用 分割 然后粘贴前两个 一些东西 paste sapp
  • 跨类别和列自动化卡方

    我有一个调查数据框 其中包含几个问题 列 编码为 1 同意 0 不同意 受访者 行 根据 年龄 年轻 中年 老年 地区 东 中 西 等指标进行分类 大约有30个类别总共 3个年龄 3个地区 2个性别 11个职业等 在每个指标中 类别不重叠且
  • 使用faceting()时如何连接geom_point()和geom_line?

    我有一个问题 但我在互联网上没有找到任何相关信息 我很高兴得到一些提示 我有一个数据集 其中 x 轴是离散的 但我想将这些点相互连接 我可以做到 我的问题是当我添加分面选项时 我无法再将这些点相互链接起来 我找到了一个替代方案 但看起来不太
  • 将模式的所有元素与向量以相同的顺序匹配

    我创建了一个函数yes seq需要两个参数 一个模式pat和数据dat 该函数以相同的顺序查找数据中是否存在模式 例如 dat lt letters 1 10 dat 1 a b c d e f g h i j pat lt c a c g
  • 如何将数据从长格式重塑为宽格式

    我在重新排列以下数据框时遇到问题 set seed 45 dat1 lt data frame name rep c firstName secondName each 4 numbers rep 1 4 2 value rnorm 8 d
  • 使用 R 下载压缩数据文件、提取并导入 .csv

    我正在尝试使用以下方法从网页下载并提取 csv 文件R 这个问题是重复的使用 R 下载压缩数据文件 提取和导入数据 https stackoverflow com questions 3053833 using r to download
  • 如何不显示 ggplot 轴上的所有标签?

    I m trying to using ggplot2 to plot this But as you can see on the x axis you can t read anything 那么如何在 x 轴上显示每 10 年的值呢
  • 来自大型数据帧的共现

    我有一个数据框 其中包含有关每个用户访问过哪些城市的信息 df visited lt data frame user c john john claire claire doe doe city c Antananarivo Barcelo
  • R 无法回忆起内存中的对象

    我正在构建一个包含多个步骤的函数 其中每个步骤都会创建一个对象 某个步骤失败 temp3 并且无法找到前面的步骤对象 错误 未找到对象 temp2 我不知道为什么 我有类似的函数 遵循完全相同的结构 每个步骤都遵循先前创建的对象 在函数内
  • R ggplot2 分面保持比率但覆盖/定义输出图大小

    我目前正在使用 ggplot2 来比较不同组的统计数据 每个组属于不同的区域 这是通过运行 R 脚本的 Web 应用程序 tikiwiki CMS 插件 R 完成的 每个区域我可以有 2 到 30 个或更多组 相同的 R 脚本针对唯一网页中
  • ggplot2 中的中心图标题

    这个简单的代码 以及今天早上我的所有脚本 已经开始在 ggplot2 中给我一个偏离中心的标题 Ubuntu version 16 04 R studio version Version 0 99 896 R version 3 3 2 G
  • 按名称包含在单个对象中的多个列对 data.frame 进行排序?

    我想排序一个data frame由多列组成 理想情况下使用基础 R 无需任何外部包 尽管如果有必要 就这样吧 读过如何按列对数据框进行排序 https stackoverflow com questions 1296646 how to s
  • 从 leafletProxy() 返回渲染的传单地图

    是否可以在渲染后在 Shiny 中检索传单地图 下面是一个代码示例 展示了如何生成地图leaflet 与返回的不同leafletProxy 即使它们在渲染时看起来完全相同 是否有一个功能可能不同于leafletProxy 获取实际的 htm

随机推荐

  • 计算表达式中的递归函数

    首先介绍一些背景 我目前正在学习一些有关单子解析器组合器的东西 当我尝试从以下位置转移 chainl1 功能时这张纸 第16 17页 我想出了这个解决方案 let chainl1 p op parser let x p let rec ch
  • 如何在 JavaScript 中合并两个数组并消除重复项

    我有两个 JavaScript 数组 var array1 Vijendra Singh var array2 Singh Shakya 我希望输出是 var array3 Vijendra Singh Shakya 输出数组应删除重复的单
  • 如何计算音频 dB 级别?

    我想用计算机的麦克风计算房间噪音水平 我将噪音录制为音频文件 但如何计算噪音 dB 级别 我不知道如何开始 如果您想要技术上准确或有科学价值的答案 那么前面的所有答案都是正确的 但是 如果您只想对相对响度进行一般估计 例如您想检查狗是否在吠
  • Qt3d 使用 QSceneLoader 和 qt 5.8

    我尝试使用 QSceneLoader 加载在外部编辑器中创建的 3D 场景 但没有成功 我总是在加载阶段得到断言 我使用 OBJ 模型 qt 的示例 它很容易加载为 QMesh 测试仓库https bitbucket org ibnz te
  • Ajax.BeginForm OnBegin 确认 通过 jquery modal

    我正在使用 jQuery UI 对话框 我有一个删除表单如下 using Ajax BeginForm DeleteUser Administrator new id Model new AjaxOptions OnSuccess Dele
  • MariaDB 的 Hibernate 命名策略 (UPPER_SNAKE_CASE)

    在我的应用程序中 我使用 Flyway 进行数据迁移 因此我定义了所有名称为UPPER SNAKE CASE 例如用户 gt USERS 候选组 gt CANDIDATE GROUP 我为不同的环境提供了2种配置 本地和docker 在本地
  • php:使用cURL获取html源代码

    我怎样才能得到html源代码http www example webpage com file html不使用file get contents 我需要知道这一点 因为在某些网络主机上allow url fopen已禁用 因此您无法使用fi
  • 如何修复在 Windows 上运行 Npm 时出现 SSL 证书错误?

    当我尝试使用 npm 安装软件包时 它不起作用 经过漫长的等待 我最终得到一个错误 无法建立隧道套接字 sutatusCode 403 npm install coffee script npm http GET https registr
  • Python tkinter AskopenFileName 没有响应

    我正在使用 tkinter asopenfilename 触发文件选择器 以便从本地目录读取文件 我的问题是 选择文件后 窗口冻结并且 python 没有响应 我已经尝试过这篇文章的答案 Tkinter Askopenfilename 不会
  • Oracle中如何检查索引是否被使用

    SELECT FROM SELECT TEMP ROWNUM RNUM FROM SELECT entry guid FROM alertdevtest ENTRY WHERE Upper alert name alertname AND
  • CSS 背景图像属性未加载

    我正在开发一个网站 目前位于主页上 我有一个以前编写的 CSS 标头 并且想用图像替换标头的背景 div 而不是像之前的设计那样采用纯色 我有一个标题图片 在img header jpg目录 我正在使用加载背景图像background im
  • 如何在Excel VBA中将值从数组传递到特定单元格(不是组合列表)中的下拉列表

    我正在尝试将值从数组传递到特定单元格中的下拉列表 假设我有一个包含值 1 2 3 的数组 并且我希望单元格 A1 包含一个包含这些值的下拉列表 有什么方法可以做到这一点吗 我试图实现这一目标 而不必首先将这些值分配给不同的单元格并使用数据验
  • 将 Ipopt 与英特尔 MKL 链接

    我正在尝试将 Ipopt 与 Intel MKL 链接起来 指示 英特尔的链接顾问建议 链接线 Wl start group MKLROOT lib intel64 libmkl intel ilp64 a MKLROOT lib inte
  • 交错文本文件内容的最 Pythonic 方式是什么?

    Python问题 如果我有一个文件列表 如何打印每个文件中的第 1 行 然后 第 2 行等 显然我是一个Python新手 Example file1 foo1 bar1 file2 foo2 bar2 file3 foo3 bar3 函数调
  • ArrayList容量增量方程

    在JDK 1 7中引入了ArrayList java中的方法ensureCapacity使用以下表达式增加数组容量 int newCapacity oldCapacity oldCapacity gt gt 1 看来新产能将比旧产能增加近5
  • 在链式构造函数中设置只读字段

    我有一个类 其中有两个在构造函数中设置的只读字段 我有一个派生类 希望将它们设置为不同的构造函数中的值 但是 尝试这样做会导致 CS1091 无法将只读字段分配给 构造函数或变量初始值设定项除外 错误 我不明白这是为什么 我am分配给构造函
  • Django:记录模板错误

    当我在 django 模板中出错时 placeholder 我没有收到任何错误 只是输出中我期望内容的空白 发生这种情况时 有没有办法在我的日志中查看某些内容 最好使用logging warning or logging error 就在这
  • 批量-用百分比符号替换

    我想用 替换字符串中的 mod set string string mod x 我应该输入什么作为 x 您可以通过启用延迟扩展来做到这一点 这样您就可以使用 作为分隔符 然后 将百分号加倍可以将百分比表示为替换字符 echo off set
  • Sitecore页面编辑器-如何扩展页面编辑器项目编辑面板

    需要在页面编辑器 项目编辑部分添加 发布 功能 在 更多 部分下是理想的 我怎样才能做到这一点 首先您需要创建一个命令类 最简单的版本是 using System using Sitecore Shell Applications WebE
  • 当逻辑条件意味着不应评估输出时,为什么 dplyr 会在此嵌套 if_else 中出错?

    我有一个嵌套的if else里面的声明mutate 在我的示例数据框中 tmp df2 lt data frame a c 1 1 2 b c T F T c c 1 2 3 a b c 1 1 TRUE 1 2 1 FALSE 2 3 2