Как эффективно сопоставить уникальные значения вектора с последовательными целыми числами? - PullRequest
4 голосов
/ 21 сентября 2010

У меня есть кадр данных в 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).

Ответы [ 2 ]

5 голосов
/ 21 сентября 2010

Просто относитесь к ним как к факторам:

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. Если вы хотите нестандартную сортировку, вы можете просто явно указать уровни в нужном вам порядке.

4 голосов
/ 21 сентября 2010

Использовать преобразование коэффициентов в целые числа:

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)

Модифицированная версия, группирующая трт-фактор по сайту:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...