ifelse 中的条件:多列/变量中的值

ps_*_*s_r 5 if-statement r operators conditional-statements dplyr

这可能很简单:

我喜欢创建条件“变量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"
Run Code Online (Sandbox Code Playgroud)

var2 == 1 | var3 == 1
Run Code Online (Sandbox Code Playgroud)

我要更换的是

var4 == "value1" | var5 == "value1"
Run Code Online (Sandbox Code Playgroud)

可重现的例子:

(我省略了 var1-var3)

var4 <- c("value1", "valuex")
var5 <- c("valuey", "value1")

df <- data.frame(var4, var5)
Run Code Online (Sandbox Code Playgroud)

我使用 dplyr 包中的 case_when() 但它也应该与基础 R ifelse 一起使用。

df <- df %>% mutate(newvar= case_when( CONDITION HERE ~ "value1", 
                     TRUE~"else"))
Run Code Online (Sandbox Code Playgroud)

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

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

akr*_*run 6

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

df %>%
  filter_all(any_vars(. =="value1"))
Run Code Online (Sandbox Code Playgroud)

对于特定的列子集,请使用 filter_at

df %>%
   filter_at(vars(matches("var\\d+")), any_vars(.== "value1"))
Run Code Online (Sandbox Code Playgroud)

要创建基于多列比较的二进制列,请使用mutate_at(或者mutate_all如果需要比较所有列),reduce将其绑定到单个逻辑/整数向量并将其绑定为列以在数据集中创建新列

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

或者正如评论中提到的@Nick,我们可以使用across( dplyrversion >1.0.0) 而不是已弃用的mutate_at

df %>%
   mutate(across(matches("var\\d+"), ~!is.na(.)))
Run Code Online (Sandbox Code Playgroud)


Moo*_*per 3

var4 == "value1" | var5 == "value1"相当于any(c(var4,var5)=="value1")

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

df$new_col <- apply(df[,c("var4","var5")] == "value1",1,any)
Run Code Online (Sandbox Code Playgroud)