我有以下类型的数据框
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/