这可能很简单:
我喜欢创建条件“变量 B 或变量 A 中的值”。
有效的是:var1 %in% c("value1", "value2")
条件:var1 是 value1 或 value2var2 | 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_all
与 any_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/