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)
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)