我在R中有一个数据帧,其中包含一个非连续数字(data$SiteID
)的向量,我希望将这些数字映射到连续数字(data$site
)的向量到唯一值{{ 1}}。在每个网站中,我想将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'))
应为data$site
。c(1,1,1,2,3,3,4,4)
应为data$trt
。答案 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)