【问题标题】:Recoding range of numerics into single numeric in R将数字范围重新编码为R中的单个数字
【发布时间】:2018-04-29 06:31:13
【问题描述】:

我正在尝试重新编码具有四列的数据框。在所有列中,我想将所有数值重新编码为这些序数值:

  • 0 保持原样
  • 1:3
  • 4:10
  • 11:22
  • 22:最大

这是数据框:

> df
   T4.1 T4.2 T4.3 T4.4
1     0   54    0    5
2     0    5    0    0
3     0    3    0    0
4     0    2    0    0
5     0    3    0    0
6     0    2    0    0
7     0    4    0    0
8     1   20    0    0
9     1    7    0    2
10    0   14    0    0
11    0    3    0    0
12    0  202    0   41
13    2   12    0    0
14    3    6    0    0
15    3   21    0    3
16    0  143    0    0
17    0    0    0    0
18    4    9    0    0
19    3   15    0    0
20    0   58    0    6
21    2    0    0    0
22    0   52    0    0
23    0    3    0    0
24    0    1    0    0
25    4    6    0    1
26    1    4    0    0
27    0   38    0    1
28    0    6    0    0
29    0    8    0    0
30    0   29    0    4
31    1   14    0    0
32    0   12    0   10
33    4    1    0    3

我正在尝试使用recode 函数,但我似乎无法弄清楚如何在其中输入一系列数值。我的尝试出现以下错误:

> recode(df, 11:22=3)
Error: unexpected '=' in "recode(df, 11:22="
> recode(df, c(11:22)=3)
Error: unexpected '=' in "recode(df, c(11:22)="

我将不胜感激任何建议。感谢您的宝贵时间!

编辑:谢谢大家的帮助!!

【问题讨论】:

    标签: r recode


    【解决方案1】:

    您可以使用 cut 的值范围为:

    df_res <- as.data.frame(sapply(df, function(x)cut(x, 
                breaks = c(-0.5, 0.5, 3.5, 10.5, 22.5, Inf), 
                labels = c(0, 1, 2, 3, 4)))
               )
    
    str(df_res)
    #'data.frame':  33 obs. of  4 variables:
    # $ T4.1: Factor w/ 3 levels "0","1","2": 1 1 1 1 1 1 1 2 2 1 ...
    # $ T4.2: Factor w/ 5 levels "0","1","2","3",..: 5 3 2 2 2 2 3 4 3 4 ...
    # $ T4.3: Factor w/ 1 level "0": 1 1 1 1 1 1 1 1 1 1 ...
    # $ T4.4: Factor w/ 4 levels "0","1","2","4": 3 1 1 1 1 1 1 1 2 1 ...
    
    df_res
    #    T4.1 T4.2 T4.3 T4.4
    # 1     0    4    0    2
    # 2     0    2    0    0
    # 3     0    1    0    0
    # 4     0    1    0    0
    # 5     0    1    0    0
    # 6     0    1    0    0
    # 7     0    2    0    0
    # 8     1    3    0    0
    # 9     1    2    0    1
    # 10    0    3    0    0
    # 11    0    1    0    0
    # 12    0    4    0    4
    # 13    1    3    0    0
    # 14    1    2    0    0
    # 15    1    3    0    1
    # 16    0    4    0    0
    # 17    0    0    0    0
    # 18    2    2    0    0
    # 19    1    3    0    0
    # 20    0    4    0    2
    # 21    1    0    0    0
    # 22    0    4    0    0
    # 23    0    1    0    0
    # 24    0    1    0    0
    # 25    2    2    0    1
    # 26    1    2    0    0
    # 27    0    4    0    1
    # 28    0    2    0    0
    # 29    0    2    0    0
    # 30    0    4    0    2
    # 31    1    3    0    0
    # 32    0    3    0    2
    # 33    2    1    0    1
    

    【讨论】:

      【解决方案2】:

      我发现命名向量是重新编码变量的好模式,尤其是对于不规则模式。你可以在这里使用这样的:

      decoder <- c(0, rep(1,3), rep(2,7), rep(3, 12))
      names(decoder) <- 0:22
      
      sapply(df, function(x) ifelse(x <= 22, decoder[as.character(x)], 4))
      

      如果重新编码更多的是一种模式,cut 是一个有用的功能。

      【讨论】:

      • 命名向量是不错的选择。基于range-of-values,即使数据中没有明确的模式也可以使用cut。我添加了一个答案来演示它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-05
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-12
      • 1970-01-01
      相关资源
      最近更新 更多