首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多矢量case_when的应用

多矢量case_when的应用
EN

Stack Overflow用户
提问于 2019-03-28 21:17:22
回答 2查看 2.6K关注 0票数 4

我试图使用case_when根据两个独立的输入修改/变异列。用于在RHS上创建LHS逻辑和相应的输入值的人。下面是一个例子。

代码语言:javascript
复制
library(dplyr)
library(purrr)
library(tibble)

df <- tibble(var = paste0(rep("var", 10), 1:10),
                 label = c("label1", "label2", rep(NA, 7), "label10"))

match_var <- paste0(rep("var", 7), 3:9)
new_labels <- paste0(rep("add_this_label", 7), 3:9)

df %>% 
  mutate(test = map2(match_var , new_labels,
                     ~case_when(
                       var == .x ~ .y,
                       TRUE ~ label
                     )
  ))

我认为问题在于,在case_when中,所有东西都被计算为表达式,但我不完全确定。可以手动键入case_when中的所有7行,但是当向量match_varsnew_labels非常长时,我的应用程序要求我完成这一任务--手工键入case_when是不可行的。

代码语言:javascript
复制
df %>% 
  mutate(label = case_when(
    var == match_var[1] ~ new_labels[1],
    var == match_var[2] ~ new_labels[2],
    var == match_var[3] ~ new_labels[3],
    var == match_var[4] ~ new_labels[4],
    var == match_var[5] ~ new_labels[5],
    var == match_var[6] ~ new_labels[6],
    var == match_var[7] ~ new_labels[7],
    TRUE ~ label
  ))

编辑:所需的结果可以使用for循环来实现,但是现在我想知道是否可以使用case_whenmap2_*函数实现这一点?

代码语言:javascript
复制
for (i in seq_along(match_var)) {
  df$label <- ifelse(df$var == match_var[i], new_labels[i], df$label)
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-28 21:21:29

我们创建一个命名向量,并使用它来匹配'var‘中的值,以便将NA元素更改为'new_labels’。

代码语言:javascript
复制
library(tibble)
library(dplyr)
df %>%
    mutate(label = case_when(is.na(label) ~ 
                       deframe(tibble(match_var, new_labels))[var], 
         TRUE ~ label))
# A tibble: 10 x 2
#   var   label          
#   <chr> <chr>          
# 1 var1  label1         
# 2 var2  label2         
# 3 var3  add_this_label3
# 4 var4  add_this_label4
# 5 var5  add_this_label5
# 6 var6  add_this_label6
# 7 var7  add_this_label7
# 8 var8  add_this_label8
# 9 var9  add_this_label9
#10 var10 label10        

注意:除了使用deframe之外,还可以使用setNames创建命名向量。

票数 2
EN

Stack Overflow用户

发布于 2019-09-30 18:00:42

由于您正在比较==条件,所以也可以使用命名向量(注意需要取消引号剪接!!!)与dplyr::recode进行比较:

代码语言:javascript
复制
df %>%
    mutate(
        label = recode(
            var,
            !!!setNames(new_labels, match_var),
            .default = label
        )
    )
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55406974

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档