多列动态指定上的“ if_else”条件

如何解决多列动态指定上的“ if_else”条件

我正在基于多个现有列的值尝试mutate的新列,以便如果任何列等于指定值,则if_else的值为TRUE。我可以使用if_else中的多个比较表达式来执行此操作,但是这不起作用,因为我需要使用准引号动态指定列。重新解释下面的解释性注释。

对于如何评估多个动态指定列的比较的建议,我将不胜感激。

预先感谢您的帮助!

library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter,lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect,setdiff,setequal,union

mtcars <- head(mtcars,8)

# Desired output,using individual comparisons for each column
mtcars %>% 
  mutate(color = if_else(
    (gear == 4 | carb == 4),"purple","green")
  )
#>    mpg cyl  disp  hp drat    wt  qsec vs am gear carb  color
#> 1 21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4 purple
#> 2 21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4 purple
#> 3 22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1 purple
#> 4 21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1  green
#> 5 18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2  green
#> 6 18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1  green
#> 7 14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4 purple
#> 8 24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2 purple

# Failed attempts to do comparisons on multiple columns
mtcars %>% 
  mutate(color = if_else(
    (gear|carb == 4),"green")
  )
#>    mpg cyl  disp  hp drat    wt  qsec vs am gear carb  color
#> 1 21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4 purple
#> 2 21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4 purple
#> 3 22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1 purple
#> 4 21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1 purple
#> 5 18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2 purple
#> 6 18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1 purple
#> 7 14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4 purple
#> 8 24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2 purple

mtcars %>% 
  mutate(color = if_else(
    (c(gear,carb) == 4),"green")
  )
#> Error: Problem with `mutate()` input `color`.
#> x Input `color` can't be recycled to size 8.
#> ℹ Input `color` is `if_else((c(gear,"green")`.
#> ℹ Input `color` must be size 8 or 1,not 16.

# Using dynamically specified columns and quasiquotation
my_vars <- c("gear","carb")

# Quasiquotation works with `select`,and `coalesce`
mtcars %>% select(!!!syms(my_vars))
#>                   gear carb
#> Mazda RX4            4    4
#> Mazda RX4 Wag        4    4
#> Datsun 710           4    1
#> Hornet 4 Drive       3    1
#> Hornet Sportabout    3    2
#> Valiant              3    1
#> Duster 360           3    4
#> Merc 240D            4    2
mtcars %>% mutate(any_value = coalesce(!!!syms(my_vars)))
#>    mpg cyl  disp  hp drat    wt  qsec vs am gear carb any_value
#> 1 21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4         4
#> 2 21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4         4
#> 3 22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1         4
#> 4 21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1         3
#> 5 18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2         3
#> 6 18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1         3
#> 7 14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4         3
#> 8 24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2         4

# Desired `mutate`: if any columns (via quasiquotation) == 4,then TRUE
mtcars %>% 
  mutate(color = if_else(
    any(!!!syms(my_vars) == 4),"green")
  )
#> Error in splice(dot_call(capture_dots,frame_env = frame_env,named = named,: 'list' object cannot be coerced to type 'double'

reprex package(v0.3.0)于2020-08-17创建

解决方法

mtcars %>%
  mutate(
    flag = eval(parse(text = str_c(my_vars," == 4",collapse = "|"))),color = if_else(flag,"purple","green")
  ) %>%
  select(-flag)
,

您可以对要检查的列进行子集化,将它们与值进行比较,然后执行rowSums来计算它们的出现并根据该值分配值。

mtcars$any_value <- ifelse(rowSums(mtcars[my_vars] == 4) > 0,'purple','green')

#Without ifelse
mtcars$any_value <- c('green','purple')[(rowSums(mtcars[my_vars] == 4) > 0) + 1]

mtcars
#                   mpg cyl  disp  hp drat    wt  qsec vs am gear carb any_value
#Mazda RX4         21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4    purple
#Mazda RX4 Wag     21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4    purple
#Datsun 710        22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1    purple
#Hornet 4 Drive    21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1     green
#Hornet Sportabout 18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2     green
#Valiant           18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1     green
#Duster 360        14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4    purple
#Merc 240D         24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2    purple

使用tidyverserowwise的{​​{1}}方法

c_across

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-