我在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)
data$site应该是c(1,1,1,2,3,3,4,4)。data$trt应该是c(1,0,1,0,1,0,0,1)。只需将它们视为因素:
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之前。如果您要进行非标准排序,则可以按照所需顺序明确指定级别。
使用因子到整数的转换:
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)
| 归档时间: |
|
| 查看次数: |
3818 次 |
| 最近记录: |