【问题标题】:Recoding levels of factors重新编码因子水平
【发布时间】:2013-04-29 05:40:08
【问题描述】:

我有以下数据框:

forStack
  AGE  BMI time          A         B      ID
 1  59 23.8    0     (0,75]  (4,14.9] 9000099
 2  69 29.8    0 (96.4,100]  (-Inf,0] 9000296
 3  71 22.7    0  (75,89.3]  (4,14.9] 9000622
 4  56 32.4    0     (0,75] (14.9,68] 9000798
 5  72 30.7    0     (0,75] (14.9,68] 9001104
 6  75 23.5    0 (96.4,100]     (0,4] 9001400

dput (forStack)
structure(list(AGE = c(59, 69, 71, 56, 72, 75), BMI = c(23.8, 
29.8, 22.7, 32.4, 30.7, 23.5), time = c(0, 0, 0, 0, 0, 0), A = structure(c(2L, 
5L, 3L, 2L, 2L, 5L), .Label = c("(-Inf,0]", "(0,75]", "(75,89.3]", 
"(89.3,96.4]", "(96.4,100]", "(100, Inf]"), class = "factor"), 
B = structure(c(3L, 1L, 3L, 4L, 4L, 2L), .Label = c("(-Inf,0]", 
"(0,4]", "(4,14.9]", "(14.9,68]", "(68, Inf]"), class = "factor"), 
ID = c(9000099, 9000296, 9000622, 9000798, 9001104, 9001400
)), .Names = c("AGE", "BMI", "time", "A", "B", "ID"), row.names = c(NA, 
6L), class = "data.frame")

变量AB是代表四分位数的因子:

   forStack$A
   [1] (0,75]     (96.4,100] (75,89.3]  (0,75]     (0,75]     (96.4,100]
   Levels: (-Inf,0] (0,75] (75,89.3] (89.3,96.4] (96.4,100] (100, Inf]

   forStack$B
   [1] (4,14.9]  (-Inf,0]  (4,14.9]  (14.9,68] (14.9,68] (0,4]    
   Levels: (-Inf,0] (0,4] (4,14.9] (14.9,68] (68, Inf]

我想将AB 值重新编码为两个水平因子,如下所示:

对于A,较高的因子水平(96.4,100](100, Inf] 应重新编码为0 水平,其他水平- 为1 水平

对于B,最低因子水平(-Inf,0](0,4] 应重新编码为 0 水平,其他水平 - 为 1 水平

因此,数据框应如下所示:

 forStack
  AGE  BMI time          A         B      ID
 1  59 23.8    0         1         1   9000099
 2  69 29.8    0         0         0   9000296
 3  71 22.7    0         1         1   9000622
 4  56 32.4    0         1         1   9000798
 5  72 30.7    0         1         1   9001104
 6  75 23.5    0         0         0   9001400

最有效的方法是什么? 提前非常感谢您

【问题讨论】:

    标签: r


    【解决方案1】:

    这是一种方法:

    within(forStack, {
      A <- as.numeric(!A %in% tail(levels(A), 2))
      B <- as.numeric(!B %in% head(levels(B), 2))
    })
    #   AGE  BMI time A B      ID
    # 1  59 23.8    0 1 1 9000099
    # 2  69 29.8    0 0 0 9000296
    # 3  71 22.7    0 1 1 9000622
    # 4  56 32.4    0 1 1 9000798
    # 5  72 30.7    0 1 1 9001104
    # 6  75 23.5    0 0 0 9001400
    

    这里的基本思想是headtail 都有一个“n”参数,可让您从向量或数据集的“头”和“尾”中指定需要多少个值。这让我们可以轻松获取向量 A 的 (96.4,100](100, Inf],以及向量 B 的相关值。

    within 是动态替换 data.frame 中值的便捷方式。

    【讨论】:

      【解决方案2】:

      既然你知道因素是有序的,你可以做以下事情

      within(forStack, {
          Ar <- (as.integer(A) < length(levels(A))-1)*1
          Br <- (as.integer(B) > 2)*1
      })
      

      【讨论】:

      • 非常感谢阿南达·马赫托和 mnel!你的回答很有帮助,如何同时接受?
      • 这个也很不错。 +1
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多