根据命名向量替换列表列中的值

replace values in list-column based on named vector

给定以下 df(或 tibble)和 list-column

set.seed(1)
df <- data.frame(a = sample(letters, 7),
                 b = sample(letters, 7),
                 c = c("yes", "no", "yes", "no", "yes", "no", "no"),
                 list_col = I(list(c(1, 2, 3), "hjhj", c(1, 4), "kkjkj", c(3, 4), "jkj", c(1, 2))))
df
#   a b   c list_col
# 1 y r yes  1, 2, 3
# 2 d s  no     hjhj
# 3 g a yes     1, 4
# 4 a u  no    kkjkj
# 5 b w yes     3, 4
# 6 k j  no      jkj
# 7 n n  no     1, 2

str(df)
# 'data.frame': 7 obs. of  4 variables:
#  $ a       : chr  "y" "d" "g" "a" ...
#  $ b       : chr  "r" "s" "a" "u" ...
#  $ c       : chr  "yes" "no" "yes" "no" ...
#  $ list_col:List of 7
#   ..$ : num  1 2 3
#   ..$ : chr "hjhj"
#   ..$ : num  1 4
#   ..$ : chr "kkjkj"
#   ..$ : num  3 4
#   ..$ : chr "jkj"
#   ..$ : num  1 2
#   ..- attr(*, "class")= chr "AsIs"

我想将 list_col 值替换为查找 table 中相应值的名称,但仅适用于第 c == "yes"

列的行
#named lookup
c_yes_column_look_up <- c("number1" = 1,
                          "number2" = 2,
                          "number3" = 3, 
                          "number4" = 4)

所以我的最终 df 看起来像:

df_final
#   a b   c     list_col
# 1 y r yes number1,....
# 2 d s  no         hjhj
# 3 g a yes number1,....
# 4 a u  no        kkjkj
# 5 b w yes number3,....
# 6 k j  no          jkj
# 7 n n  no         1, 2

str(df_final)
# 'data.frame': 7 obs. of  4 variables:
#  $ a       : chr  "y" "d" "g" "a" ...
#  $ b       : chr  "r" "s" "a" "u" ...
#  $ c       : chr  "yes" "no" "yes" "no" ...
#  $ list_col:List of 7
#   ..$ : chr  "number1" "number2" "number3"
#   ..$ : chr "hjhj"
#   ..$ : chr  "number1" "number4"
#   ..$ : chr "kkjkj"
#   ..$ : chr  "number3" "number4"
#   ..$ : chr "jkj"
#   ..$ : num  1 2
#   ..- attr(*, "class")= chr "AsIs"

我在想一些与 类似的事情,但不太明白:

library(tidyverse)
df %>% 
  #rowwise() %>%
  mutate(list_col = case_when(c == "yes" & list_col %in% c_yes_column_look_up ~ names(list_col[list_col %in% c_yes_column_look_up]),
                                                        TRUE ~ list_col))

也对其他方法持开放态度,谢谢

命名向量应该反转。我们可以使用 rowwisemap2(但 map2 可能更有效)。遍历 'list_col' 和 'c' 的元素,创建一个条件,其中 'c' 值为 'yes',然后使用向量值进行名称匹配(在反向名称向量上) , coalesce(如果有NA)到return原始向量

library(dplyr)
library(purrr)
df1 <- df %>% 
    mutate(list_col = map2(list_col, c, ~ if(.y %in% 'yes')
          unname(coalesce(setNames(names(c_yes_column_look_up), 
              c_yes_column_look_up)[.x], as.character(.x))) else .x))

-输出

> str(df1)
'data.frame':   7 obs. of  4 variables:
 $ a       : chr  "y" "d" "g" "a" ...
 $ b       : chr  "r" "s" "a" "u" ...
 $ c       : chr  "yes" "no" "yes" "no" ...
 $ list_col:List of 7
  ..$ : chr  "number1" "number2" "number3"
  ..$ : chr "hjhj"
  ..$ : chr  "number1" "number4"
  ..$ : chr "kkjkj"
  ..$ : chr  "number3" "number4"
  ..$ : chr "jkj"
  ..$ : num  1 2