使用 dplyr 中的 mutate 和 case_when 将新值插入到数据框中

Inserting new values into a data frame using mutate and case_when in dplyr

我有以下字母数据框,其中包含一些用于小写字母的空白 (NA) 插槽

letters_df <- data.frame(caps = LETTERS[1:10], lows = letters[c(1,2,11,11,11,11,11,11,11,10)])
letters_df[letters_df == "k"] <- NA
letters_df

为了填补一些空白,我正在使用我构建的这个新数据框

new_letters <- data.frame(caps = c("C", "D", "F", "G", "H"),
                     lows = c("c", "d", "f", "g", "h"))

开始,我正在使用 dplyr mutate 和 case_when 如下

letters_df %>%
  mutate(lows = case_when(
    caps %in% new_letters$caps ~ new_letters$lows,
    TRUE ~ lows))

但是,结果不会添加缺失的字母,并会抛出一个错误,要求提供与 letters_df 列长度相同的向量。我以为我已经很好地掌握了这里的语法。可以帮我解决我哪里出错了吗?

您可以考虑结合使用 left_joincoalesce:

library(dplyr)

letters_df %>% 
  left_join(new_letters, by = "caps") %>% 
  mutate(lows = coalesce(lows.x, lows.y), .keep = "unused")

这个returns

   caps lows
1     A    a
2     B    b
3     C    c
4     D    d
5     E <NA>
6     F    f
7     G    g
8     H    h
9     I <NA>
10    J    j

作为与您的方法更相似的替代方法,您可以将 new_letters data.frame 转换为返回相同结果的查找向量:

lookup <- tibble::deframe(new_letters)

letters_df %>% 
  mutate(lows = case_when(caps %in% names(lookup) ~ lookup[caps],
                          TRUE ~ lows))

这是dplyrrows_*可以治疗的典型病例:

library(dplyr)

letters_df %>%
  rows_patch(new_letters, by = "caps")

   caps lows
1     A    a
2     B    b
3     C    c
4     D    d
5     E <NA>
6     F    f
7     G    g
8     H    h
9     I <NA>
10    J    j