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_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
将其转换为单个 logical/integer 向量并将其绑定为列以在数据集中创建新列
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(.)))
var4 == "value1" | var5 == "value1"
等同于 any(c(var4,var5)=="value1")
在 data.frame 中你可以这样做:
df$new_col <- apply(df[,c("var4","var5")] == "value1",1,any)
这可能很简单:
我喜欢创建条件“变量 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_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
将其转换为单个 logical/integer 向量并将其绑定为列以在数据集中创建新列
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(.)))
var4 == "value1" | var5 == "value1"
等同于 any(c(var4,var5)=="value1")
在 data.frame 中你可以这样做:
df$new_col <- apply(df[,c("var4","var5")] == "value1",1,any)