将矢量的唯一值映射到顺序整数的有效方法是什么?

时间:2010-09-20 21:00:52

标签: r

我在R中有一个数据帧,其中包含一个非连续数字(data$SiteID)的向量,我希望将这些数字映射到连续数字(data$site)的向量到唯一值{{ 1}}。在每个网站中,我想将data$SiteID映射到data$TrtID 0或下一个连续整数,以映射其他唯一data$TrtID == 'control'

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

2 个答案:

答案 0 :(得分:5)

将它们视为因素:

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

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

答案 1 :(得分:4)

使用因子转换为整数:

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)