使用 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_join
和 coalesce
:
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))
这是dplyr
的rows_*
可以治疗的典型病例:
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
我有以下字母数据框,其中包含一些用于小写字母的空白 (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"))
从
letters_df %>%
mutate(lows = case_when(
caps %in% new_letters$caps ~ new_letters$lows,
TRUE ~ lows))
但是,结果不会添加缺失的字母,并会抛出一个错误,要求提供与 letters_df 列长度相同的向量。我以为我已经很好地掌握了这里的语法。可以帮我解决我哪里出错了吗?
您可以考虑结合使用 left_join
和 coalesce
:
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))
这是dplyr
的rows_*
可以治疗的典型病例:
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