【问题标题】:What is an efficient way to map unique values of a vector to sequential integers?将向量的唯一值映射到顺序整数的有效方法是什么?
【发布时间】:2010-09-20 21:00:51
【问题描述】:

我在 R 中有一个带有非序列号向量 (data$SiteID) 的数据框,我想将其映射到序列号向量 (data$site) 到 data$SiteID 的唯一值。在每个站点中,我想将data$TrtID 映射到0,其中data$TrtID == 'control' 或下一个连续整数,对于另一个唯一的data$TrtID

data <- data.frame(SiteID = c(1,1,1,9,'108','108','15', '15'), 
                   TrtID = c('N', 'control', 'N', 'control', 'P', 'control', 'N', 'P'))
  1. data$site 应该是 c(1,1,1,2,3,3,4,4)
  2. data$trt 应该是 c(1,0,1,0,1,0,0,1)

【问题讨论】:

    标签: r


    【解决方案1】:

    将它们视为因素:

    as.numeric(factor(data$SiteID, levels = unique(data$SiteID)))
    [1] 1 1 1 2 3 3 4 4
    

    对于 Trt,由于您想要一个基于 0 的值,因此减一。

    as.numeric(factor(data$TrtID, levels = sort(unique(data$TrtID))))-1
    [1] 1 0 1 0 2 0 1 2
    

    请注意,级别参数是不同的 - Trt 首先排序,这很方便,因为控制按字母顺序排列在 N 或 P 之前。如果您想要非标准排序,您可以按照您想要的顺序显式指定级别。

    【讨论】:

    • 谢谢,这很简单也很有帮助,但我不确定 'levels' 参数的作用或如何自己找出这些信息,因为 ?as.numeric 和 ?setMethod 没有这个信息.
    • 另外,我只是改变了问题(对不起),因为我意识到我真正需要的是重新开始每个站点内的治疗顺序。
    【解决方案2】:

    使用因子到整数的转换:

    transform(data, site=as.integer(SiteID), trt=as.integer(TrtID))
    

    如果顺序很重要,可以给各个级别下具体的顺序:

    transform(data,
      site = as.integer(factor(SiteID, unique(SiteID))),
      trt  = as.integer(factor(TrtID, unique(c('control', as.character(TrtID))))) - 1L)
    

    按站点修改版本分组 trt 因子:

    transform(data,
      site = as.integer(factor(site_id, unique(site_id))),
      trt  = unsplit(tapply(trt_id, site_id, function(x)
             as.integer(factor(x))), site_id) - 1L)
    

    【讨论】:

    • 感谢您向我介绍了 transform() 和 unsplit(),但为什么要使用 '1L' 而不是 1?
    • 没有问题。仅当您想将其保留为整数时才重要,否则您可以删除 L(您也可以使用 as.numeric 而不是 as.integer)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-02
    • 2022-01-09
    • 2020-11-24
    • 1970-01-01
    • 2020-05-13
    相关资源
    最近更新 更多