ifelse 中的条件:多个 columns/variables 中的值

Condition in ifelse: Value in multiple columns/variables

这可能很简单:

我喜欢创建条件“变量 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

(关于 Whosebug 的第一个问题。如有任何不明之处,请见谅。)

如果我们需要检查 '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 将其转换为单个 logical/integer 向量并将其绑定为列以在数据集中创建新列

library(dplyr)
library(purrr)
df %>% 
  mutate_at(vars(matches("var\d+")), funs(.=="value1")) %>% 
  reduce(`|`) %>%
  as.integer %>%
  bind_cols(df, new_var = .)

或者正如@Nick 在评论中提到的那样,我们可以使用 acrossdplyr 版本 >1.0.0)而不是已弃用的 mutate_at

df %>%
   mutate(across(matches("var\d+"), ~!is.na(.)))

var4 == "value1" | var5 == "value1" 等同于 any(c(var4,var5)=="value1")

在 data.frame 中你可以这样做:

df$new_col <- apply(df[,c("var4","var5")] == "value1",1,any)