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 的第一个问题。抱歉有任何不清楚的地方。)
如果我们需要检查每行的任何一列中是否存在“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)
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)
| 归档时间: |
|
| 查看次数: |
8365 次 |
| 最近记录: |