dplyr通过比较变量和不同大小的向量来变异变量

Gee*_*eet 5 r case-when stringr dplyr tibble

我有以下类型的数据帧

df <- tibble::tribble(~x,
                      c("A", "B"),
                      c("A", "B", "C"),
                      c("A", "B", "C", "D"),
                      c("A", "B"))
Run Code Online (Sandbox Code Playgroud)

和这些矢量

vec1 <- c("A", "B")
vec2 <- c("A", "B", "C")
vec3 <- c("A", "B", "C", "D")
Run Code Online (Sandbox Code Playgroud)

我想改变一个变量y,它显示哪一行有哪个向量.我尝试了以下方法,但是获取带有警告的空y变量:"较长的对象长度不是较短对象长度的倍数"

df_new <- df %>%
  mutate(y = case_when(x == vec1 ~ "vec1",
                       x == vec2 ~ "vec2",
                       x == vec2 ~ "vec3"))
Run Code Online (Sandbox Code Playgroud)

期望的输出是

df_new <- tibble::tribble(~x,                      ~y,
                          c("A", "B"),             "vec1",
                          c("A", "B", "C"),        "vec2",
                          c("A", "B", "C", "D"),   "vec3",
                          c("A", "B"),             "vec1")
Run Code Online (Sandbox Code Playgroud)

www*_*www 4

map2_lgl使用和identical来评估向量是否相同的解决方案。

library(tidyverse)

df_new <- df %>%
  mutate(y = case_when(
    map2_lgl(x, list(vec1), ~identical(.x, .y))  ~"vec1",
    map2_lgl(x, list(vec2), ~identical(.x, .y))  ~"vec2",
    map2_lgl(x, list(vec3), ~identical(.x, .y))  ~"vec3"
  ))
df_new
# # A tibble: 4 x 2
#   x         y    
#   <list>    <chr>
# 1 <chr [2]> vec1 
# 2 <chr [3]> vec2 
# 3 <chr [4]> vec3 
# 4 <chr [2]> vec1 
Run Code Online (Sandbox Code Playgroud)