Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 在使用多个向量时使用case__R_Dplyr - Fatal编程技术网

R 在使用多个向量时使用case_

R 在使用多个向量时使用case_,r,dplyr,R,Dplyr,我试图在时使用case\u来修改/变异基于两个独立输入的列。用于在RHS上创建LHS逻辑和相应输入值的程序。下面提供了一个例子 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 <-

我试图在时使用
case\u来修改/变异基于两个独立输入的列。用于在RHS上创建LHS逻辑和相应输入值的程序。下面提供了一个例子

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
                     )
  ))
编辑:使用
for
循环可以实现所需的结果,但现在我想知道,使用
case\u when
map2.*
函数是否可以实现这一点

for (i in seq_along(match_var)) {
  df$label <- ifelse(df$var == match_var[i], new_labels[i], df$label)
}
for(i在序列中沿(匹配变量)){

df$label我们创建一个命名向量,并使用它匹配'var'中的值,以便将NA元素更改为'new_label'

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        
库(TIBLE)
图书馆(dplyr)
df%>%
当(is.na(label)~
碎片整理(TIBLE(匹配变量,新标签))[var],
真~标签)
#一个tibble:10x2
#变量标签
#              
#1 var1 label1
#2 var2 label2
#3变量3添加此标签3
#4 var4添加此标签4
#5变量5添加此标签5
#6变量6添加此标签6
#7 var7添加此标签7
#8 var8添加此标签8
#9 var9添加此标签9
#10 var10 label10

注意:除了使用
碎片整理
,还可以使用
集合名
创建命名向量

您可以将新标签连接到数据帧,并根据需要使用旧标签填充

库(“tidyverse”)
df var标签新_标签
#>                  
#>1 var1 label1 label1
#>2 var2 label2 label2
#>3变量3添加此标签3
#>4 var4添加此标签4
#>5变量5添加此标签5
#>6变量6添加此标签6
#>7 var7添加此标签7
#>8 var8添加此标签8
#>9 var9添加此标签9
#>10 var10 label10 label10

由(v0.2.1)

于2019-03-28创建,因为您正在比较
=
条件,这也可以通过使用命名向量进行
dplyr::recode
来完成(注意需要取消拼接
!!!
):


太好了!如果你不介意我问一下,你能解释一下命名向量是如何在“CaseYu'上工作的吗?它是不是与NSE有关?这是一个创造性的方法,我使用了我没有考虑的连接。我可能选择AkRunn解决方案,只是因为我希望避免由于性能的原因而加入,但是我明天会测试。
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        
df %>%
    mutate(
        label = recode(
            var,
            !!!setNames(new_labels, match_var),
            .default = label
        )
    )