R语言 将一个表中的值从另一个表中的相应键替换为特定列

nzk0hqpo  于 2023-02-06  发布在  其他
关注(0)|答案(2)|浏览(204)

我正在处理调查表中的大型数据集,该调查表在某些列而不是所有列中包含编码的回答。我希望将编码的回答替换为实际值。键/字典存储在另一个数据库中。复杂的因素是不同的问题(在原始数据集中存储为列)使用相同的代码(通常为数字),但代码根据列(问题)具有不同的含义。
如何使用与字典表中存储的相应键不同的值替换原始数据集中的编码值,但要使用特定的列名(也存储在字典表中)?
下面是原始数据集和字典表的示例,以及所需的结果。

original <- data.frame(
  name = c('Jane','Mary','John', 'Billy'),
  home = c(1,3,4,2),
  car = c('b','b','a','b'),
  shirt = c(3,2,1,1),
  shoes = c('Black','Black','Black','Brown')
  )

keymap <- data.frame(
  column_name=c('home','home','home','home','car','car','shirt','shirt','shirt'),
  value_old=c('1','2','3','4','a','b','1','2','3'),
  value_new=c('Single family','Duplex','Condo','Apartment','Sedan','SUV','White','Red','Blue')
)

result <- data.frame(
  name = c('Jane','Mary','John', 'Billy'),
  home = c('Single family','Condo','Apartment','Duplex'),
  car = c('SUV','SUV','Sedan','SUV'),
  shirt = c('Blue','Red','White','White'),
  shoes = c('Black','Black','Black','Brown')
)
> original
   name home car shirt shoes
1  Jane    1   b     3 Black
2  Mary    3   b     2 Black
3  John    4   a     1 Black
4 Billy    2   b     1 Brown

> keymap
  column_name value_old     value_new
1        home         1 Single family
2        home         2        Duplex
3        home         3         Condo
4        home         4     Apartment
5         car         a         Sedan
6         car         b           SUV
7       shirt         1         White
8       shirt         2           Red
9       shirt         3          Blue

> result
   name          home   car shirt shoes
1  Jane Single family   SUV  Blue Black
2  Mary         Condo   SUV   Red Black
3  John     Apartment Sedan White Black
4 Billy        Duplex   SUV White Brown

我尝试过使用dplyr的不同方法,但是没有取得很大进展,因为我对mutate/join语法没有很好的理解。

4c8rllxm

4c8rllxm1#

我们可以循环original中的"keymap"的"column_name"列中的unique值,将与列名匹配的keymapcur_column())作为子集,选择列2和3,deframe到命名向量,并与该列的值匹配以进行替换

library(dplyr)
library(tibble)
original %>% 
   mutate(across(all_of(unique(keymap$column_name)), ~ 
   (keymap %>%
            filter(column_name == cur_column()) %>%
            select(-column_name) %>%
            deframe)[as.character(.x)]))
  • 输出
name          home   car shirt shoes
1  Jane Single family   SUV  Blue Black
2  Mary         Condo   SUV   Red Black
3  John     Apartment Sedan White Black
4 Billy        Duplex   SUV White Brown

base R中的方法

lst1 <- split(with(keymap, setNames(value_new, value_old)), keymap$column_name)
original[names(lst1)] <- Map(\(x, y) y[as.character(x)], 
       original[names(lst1)], lst1)
ehxuflar

ehxuflar2#

请检查下面的代码,我们可以使用factor将一列中的值替换为另一个 Dataframe 中的数据,在本例中为keymap

library(tidyverse)

original %>% mutate(home=factor(home, keymap$value_old, keymap$value_new),
             car=factor(car, keymap$value_old, keymap$value_new),
             shirt=factor(shirt, keymap$value_old, keymap$value_new)
             )

创建于2023年2月4日,使用reprex v2.0.2

name          home   car         shirt shoes
1  Jane Single family   SUV         Condo Black
2  Mary         Condo   SUV        Duplex Black
3  John     Apartment Sedan Single family Black
4 Billy        Duplex   SUV Single family Brown

相关问题