r - dplyr 通过比较变量和不同大小的向量来改变变量

标签 r dplyr stringr case-when tibble

我有以下类型的数据框

df <- tibble::tribble(~x,
                      c("A", "B"),
                      c("A", "B", "C"),
                      c("A", "B", "C", "D"),
                      c("A", "B"))

和像这样的向量
vec1 <- c("A", "B")
vec2 <- c("A", "B", "C")
vec3 <- c("A", "B", "C", "D")

我想改变一个变量 y 来显示哪一行有哪个向量。我尝试了以下操作,但得到了带有警告的空 y 变量:“较长的对象长度不是较短对象长度的倍数”
df_new <- df %>%
  mutate(y = case_when(x == vec1 ~ "vec1",
                       x == vec2 ~ "vec2",
                       x == vec2 ~ "vec3"))

所需的输出是
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")

最佳答案

使用 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 

关于r - dplyr 通过比较变量和不同大小的向量来改变变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49989357/

相关文章:

r - 使用 any() 与 |在 dplyr::mutate 中

r - 如何在 R 中使用字符串打印数值

r - dplyr 和间隔 : count observations and sum data without using loops

r - dplyr group_by 和 mutate,如何访问数据框?

r - str_extract特定模式

r - 在两个不同的向量上匹配相同的字符串

r - 如何将多个必要的模式传递给 str_subset?

未导出的 Rd

html - 使用 VBA 将 HTML 表格转换为 Excel

r - 如何用ggplot绘制黄土表面