将向量的唯一值映射到连续整数的有效方法是什么?

Dav*_*uer 4 r

我在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'))
Run Code Online (Sandbox Code Playgroud)
  1. data$site应该是c(1,1,1,2,3,3,4,4)
  2. data$trt应该是c(1,0,1,0,1,0,0,1)

Gre*_*reg 5

只需将它们视为因素:

as.numeric(factor(data$SiteID, levels = unique(data$SiteID)))
[1] 1 1 1 2 3 3 4 4
Run Code Online (Sandbox Code Playgroud)

对于Trt,由于要基于0的值,请减去1。

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

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


Cha*_*les 4

使用因子到整数的转换:

transform(data, site=as.integer(SiteID), trt=as.integer(TrtID))
Run Code Online (Sandbox Code Playgroud)

如果顺序很重要,您可以对级别给出特定的顺序:

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

修改版本按站点分组 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)
Run Code Online (Sandbox Code Playgroud)