【问题标题】:Recode dataframe using R使用 R 重新编码数据帧
【发布时间】:2021-06-08 12:55:20
【问题描述】:

我有一个要重新编码的数据框。我以前做过类似的事情,但我的代码不再有效。自上次以来,我已经更改了 R studio 的版本。我正在尝试将字符串变量(即 A、B、C 等)重新编码为数字变量(即 5、4、3 等)。这是一个示例数据框:

DF
PreQ1    PreQ2   PreQ3    PreQ4    PostQ1    PostQ2 ... PostQ4
A          A       B         C        C         D         E
B          E       A         C        B         A         B
A          A       B         C        C         D         A

重新编码,“A”= 5,“B”= 4,“C”=3,“D”= 2,“E”= 1

要得到这个:

DF.2
PreQ1    PreQ2   PreQ3    PreQ4    PostQ1    PostQ2 ... PostQ4
 5          5       4        3       3           2        1
 4          1       5        3       4           5        4
 5          5       4        3       3           2        5

我尝试了以下代码的不同变体但没有成功:

DF.2<-DF %>% 
mutate(across(where(as.character), ~ recode, 'A'= 5, 'B'= 4, 'C'=3,'D'= 2, 'E'= 1))

DF.2<-DF %>% 
mutate(across(“PreQ1”: “PostQ4”), recode, 'A'= 5, 'B'= 4, 'C'=3,'D'= 2, 'E'= 1))

DF.2<-DF %>% 
 mutate(across(c(“PreQ1”: “PostQ4”), recode, 'A'= 5, 'B'= 4, 'C'=3,'D'= 2, 'E'= 1))

任何帮助将不胜感激!

【问题讨论】:

    标签: r dplyr data-wrangling recode


    【解决方案1】:

    base R中,我们创建了一个命名为vector,循环遍历数据集的列,使用命名向量进行匹配和替换并将其分配回数据集

    nm1 <- setNames(5:1, LETTERS[1:5])
    DF[] <- lapply(DF, function(x) nm1[x])
    

    数据

    DF <- structure(list(PreQ1 = c("A", "B", "A"), PreQ2 = c("A", "E", 
    "A"), PreQ3 = c("B", "A", "B"), PreQ4 = c("C", "C", "C"), PostQ1 = c("C", 
    "B", "C"), PostQ2 = c("D", "A", "D"), PostQ4 = c("E", "B", "A"
    )), class = "data.frame", row.names = c(NA, -3L))
    

    【讨论】:

      【解决方案2】:

      你可以使用 -

      library(dplyr)
      
      DF %>% 
        mutate(across(PreQ1:PostQ4, recode, 'A'= 5, 'B'= 4, 'C'=3,'D'= 2, 'E'= 1))
      
      #  PreQ1 PreQ2 PreQ3 PreQ4 PostQ1 PostQ2 PostQ4
      #1     5     5     4     3      3      2      1
      #2     4     1     5     3      4      5      4
      #3     5     5     4     3      3      2      5
      

      或者使用不同的语法 -

      DF %>% 
        mutate(across(PreQ1:PostQ4, ~recode(., 'A'= 5, 'B'= 4, 'C'=3,'D'= 2, 'E'= 1)))
      

      【讨论】:

      • 我已经尝试过这些,但我收到以下错误消息:错误:mutate() 输入问题..1。我..1 = across(PreQ1:PostQ4, recode, A = 5, B = 4, C = 3, D = 2, E = 1)。 x 未使用的参数(A = 5、B = 4、C = 3、D = 2、E = 1)和错误:mutate() 输入问题..1。我..1 = across(...)。 x 未使用的参数(A = 5,B = 4,C = 3,D = 2,E = 1)知道发生了什么吗?
      • 是的,您加载了另一个具有相同函数名称的包。尝试使用dplyr::recode
      【解决方案3】:

      使用match 的基本 R 选项

      df[] <- match(as.matrix(df), c("E", "D", "C", "B", "A"))
      

      给予

      > df
        PreQ1 PreQ2 PreQ3 PreQ4 PostQ1 PostQ2 PostQ4
      1     5     5     4     3      3      2      1
      2     4     1     5     3      4      5      4
      3     5     5     4     3      3      2      5
      

      【讨论】:

        【解决方案4】:

        这行得通吗:

        library(dplyr)
        library(tidyr)
        df %>% pivot_longer(cols = everything()) %>% 
           mutate(value = case_when(value == 'A' ~ 5, value == 'B' ~ 4, value == 'C' ~ 3, value == 'D' ~ 2, TRUE ~ 1)) %>% 
             pivot_wider(names_from = name, values_from = value) %>% unnest(cols = everything())
        # A tibble: 3 x 3
          PreQ1 PreQ2 PreQ3
          <dbl> <dbl> <dbl>
        1     5     5     4
        2     4     1     5
        3     5     5     4
        

        使用的数据:

        df
          PreQ1 PreQ2 PreQ3
        1     A     A     B
        2     B     E     A
        3     A     A     B
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-09-15
          • 1970-01-01
          • 2017-01-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-11-23
          相关资源
          最近更新 更多