r - ifelse : Value in multiple columns/variables 中的条件

标签 r if-statement dplyr operators conditional-statements

这可能很简单:

我喜欢创建条件“变量 B 或变量 A 中的值”。

有效的是:
var1 %in% c("value1", "value2")条件:var1 是 value1 或 value2
var2 | var3 %in% 1条件:var1 为 1 或 var2 为 1(var1 和 var2 是 0/1 的假人)

有了这些,我可以绕过重复的代码:

var1 == "value1" | var1 == "value2"


var2 == 1 | var3 == 1

我要替换的是
var4 == "value1" | var5 == "value1"

可重现的例子:

(我省略了 var1-var3)
var4 <- c("value1", "valuex")
var5 <- c("valuey", "value1")

df <- data.frame(var4, var5)

我使用 dplyr 包中的 case_when() ,但它也应该与基础 R ifelse 一起使用。
df <- df %>% mutate(newvar= case_when( CONDITION HERE ~ "value1", 
                     TRUE~"else"))

如果在 var1 或 var2 中有 value1,则新变量应该是 value1

(关于stackoverflow的第一个问题。抱歉有任何不清楚的地方。)

最佳答案

如果我们需要检查 'value1' 是否存在于每一行的任何一列中,请使用 filter_allany_vars

df %>%
  filter_all(any_vars(. =="value1"))
对于特定的列子集,使用 filter_at
df %>%
   filter_at(vars(matches("var\\d+")), any_vars(.== "value1"))

要基于多列比较创建二进制列,请使用 mutate_at (或 mutate_all 如果需要比较所有列),reduce将其绑定(bind)到单个逻辑/整数向量并将其绑定(bind)为列以在数据集中创建新列
library(dplyr)
library(purrr)
df %>% 
  mutate_at(vars(matches("var\\d+")), funs(.=="value1")) %>% 
  reduce(`|`) %>%
  as.integer %>%
  bind_cols(df, new_var = .)

或者正如评论中提到的@Nick,我们可以使用 across ( dplyr 版本 >1.0.0 )而不是已弃用的 mutate_at
df %>%
   mutate(across(matches("var\\d+"), ~!is.na(.)))

关于r - ifelse : Value in multiple columns/variables 中的条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48206415/

相关文章:

sql - 使用 dbplyr 生成 CROSS JOIN 查询

r - 搜索精确匹配 R 数据表

r - 在 R 中生成随机整数对而不进行替换

r - ifelse 在 R 中有两个条件数字和分类

c - 使用 C,一段代码,多个 header if/else?

apache-spark - 将组计数列添加到 PySpark 数据帧

r - 如何用多个变量和个体的 IQR 内的值替换异常值

r - data.table - 拆分多列

c++ - 如果语句总是被执行

r - 为什么 mutate() 给我一个错误,我应该在使用整数向量时使用整数向量?