繁体   English   中英

如何使用 R 和 dplyr 中的值转换 dataframe 跨多个列更改值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM