[英]How to change values across multiple columns using a value conversion dataframe in R with dplyr
我有一個約 50 行 x 200 列的奇數數據集,我想使用另一個 dataframe 編碼從舊名稱到新名稱的轉換,重新編碼某些列中的值(字符串)。 我想在基礎 R 或 dplyr 中執行此操作,最好使用 dplyr/tidyverse。
大約有 70 個唯一值要切換,因此單獨編碼每個更改會太長(例如簡單的 str_replace),並且大約有 70 列包含我想要更改的值,因此對一次指定一個命名列的任何內容進行編碼是不切實際的。
包含我要更改的值的列每隔三列出現一次,不包括第一個索引列,並且這些值不會出現在 dataframe 的其他任何地方。 因此,在 dataframe 中查找與轉換 dataframe 中的舊名稱匹配的任何字符串並將其替換為新名稱的 mutate_all 類型解決方案將起作用。 請注意,有一些數據缺失。
示例數據:
library("tidyverse")
# main dataset
col1 <- c("set1", "set2", "set3", "set4", "set5", "set6")
name_1 <- c("A", "D", "B", "A", "C", "A")
colour_1 <- c("red", "cyan", "red", "blue", "red", "blue")
shade_1 <- c("dark", "dark", "light", "light", "light", "light")
name_2 <- c("", "C", "D", "D", "", "A")
colour_2 <- c("", "red", "yellow", "blue", "", "purple")
shade_2 <- c("", "dark", "light", "dark", "", "light")
df_main <- data.frame(col1,name_1,colour_1,shade_1,name_2,colour_2,shade_2)
# The name_1 and name_2 columns are the ones I want changed, based on a conversion dataframe
# conversion dataframe
names_old <- c("A", "B", "C", "D", "E")
names_new <- c("1", "2", "3", "4", "5")
df_conversion <- data.frame(names_old,names_new)
# I want to base the switching from old names to new names in the main database using df_conversion
# Desired output
name_1_alt <- c("1", "4", "2", "1", "3", "1")
name_2_alt <- c("", "3", "4", "4", "", "1")
df_main_alt <- data.frame(col1,name_1_alt,colour_1,shade_1,name_2_alt,colour_2,shade_2)
非常感謝任何幫助,謝謝。
我們可以使用命名向量來匹配和更改值
library(dplyr) # 1.0.0
library(tibble)
df_main_alt1 <- df_main %>%
mutate(across(starts_with('name'), ~ deframe(df_conversion)[.]))
df_main_alt1
# col1 name_1 colour_1 shade_1 name_2 colour_2 shade_2
#1 set1 1 red dark <NA>
#2 set2 4 cyan dark 3 red dark
#3 set3 2 red light 4 yellow light
#4 set4 1 blue light 4 blue dark
#5 set5 3 red light <NA>
#6 set6 1 blue light 1 purple light
如果我們有dplyr
< 1.0.0 的版本,請使用mutate_at
df_main_alt1 <- df_main %>%
mutate_at(vars(starts_with('name')), ~
deframe(df_conversion)[.])
或者可以使用recode
df_main %>%
mutate_at(vars(starts_with('name')), ~
dplyr::recode(., !!! deframe(df_conversion)))
# col1 name_1 colour_1 shade_1 name_2 colour_2 shade_2
#1 set1 1 red dark
#2 set2 4 cyan dark 3 red dark
#3 set3 2 red light 4 yellow light
#4 set4 1 blue light 4 blue dark
#5 set5 3 red light
#6 set6 1 blue light 1 purple light
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.