使用数据值(字典)。R中的数据帧和记录 [英] Working with data values (dictionary). dataframes and recoding in R

查看:34
本文介绍了使用数据值(字典)。R中的数据帧和记录的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试处理包含30个左右变量的data.frame。这些变量都有不同的数值(例如,";0";或";32";)。数值映射到字符串(例如,变量Q1中的0&Quot;是变量Q6中的城市&Quot;,变量Q6中的32&Quot;是不可用的&q;)。

我看到在线重新编码的一些用法,以及执行此映射的较旧的plyr包,以及match函数,但我没有找到与我的结构完全匹配的任何内容。

下面我提供一个可重复使用的示例:

  test <- as.data.frame(c("1", "2", "3"))
  colnames(test) <- "Q1"
    
  dictionary <- as.data.frame(c("1", "2", "3"))
  dictionary$values <- c("dog", "fish", "cat")
  dictionary$question <- c("Q1", "Q1", "Q1")
  colnames(dictionary)[1] <- "keys"
因此,在这里,dictionary$question包含要映射到的问题;然后";键";和";值";提供映射。因此,在测试数据框中,我有一个变量(Q1),它接受三个可能的值";1";、";2";或";3";。我需要将这些映射回";dog";、";fish";、";cat";。

但我需要一种自动方法将目标数据帧中的列映射到字典中的行,然后转换值,因为实际上我有1000多个可能的值和30个变量。

编辑:我期望的是这样的函数或命令:

fun(test, dictionary)

输出:包含c("dog", "fish", "cat")的data.frame。

或者,如果测试为c("1", "1", "1"),则为c("dog", "dog", "dog")

推荐答案

如果有很多列,请循环across"test"列,匹配并替换从"字典"的subset创建的命名向量中的值,其中"问题"与相应的列名(cur_column())匹配,然后使用coalesce用原始数据值填充任何NA值

library(dplyr)
library(tibble)
test %>%
      mutate(across(everything(), ~ 
     coalesce(deframe(subset(dictionary, question == cur_column(), 
          select= -question))[as.character(.)], as.character(.))))
    Q1
1  dog
2 fish
3  cat

或要防止多次调用as.character,请执行一次

test %>%
   mutate(across(everything(), as.character),
          across(everything(), 
           ~coalesce(deframe(subset(dictionary, question == cur_column(), 
          select= -question))[.], .)))
 Q1
1  dog
2 fish
3  cat

或使用base R

lst1 <- split(dictionary[-3], dictionary$question)
test[names(lst1)] <- Map(function(x, y) {
    tmp <- with(y,  setNames(values, keys)[as.character(x)])
     tmp[is.na(tmp)] <- x[is.na(tmp)]
     tmp}, test[names(lst1)], lst1)

这篇关于使用数据值(字典)。R中的数据帧和记录的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆