有一个看起来像这样的载体
v <- c(2,5,8,5,6,6,6,6,6,6,4,3,35,7)
有没有办法可以将这些级别转换为
A,A1,A1,A1,A1,A1,A1,A1,A1,A1,A1,A1,A2,A1
我知道我可以使用if if(v < 2){out <- 'A'}
,if(v < 10){out <- 'A1'}
和if(v > 10){out <- 'A2'}
等命令
但这很慢,因为我的矢量有近百万个数字。有没有办法快速完成这项工作?理想情况下,我可以设置一个变量,其中包含A应该替换的所有数字,一个应该替换A1的var,依此类推。
答案 0 :(得分:4)
您可以尝试cut
as.character(cut(v, breaks=c(0,2,10,Inf),
labels=c('A', 'A1', 'A2')))
#[1] "A" "A1" "A1" "A1" "A1" "A1" "A1" "A1" "A1" "A1" "A1" "A1" "A2" "A1"
或findInterval
(会更快)
c('A', 'A1', 'A2')[findInterval(v, c(0,2.1, 10, Inf))]
如果要替换的值不遵循任何特定模式并根据您自己的设置规则决定,则从“v”创建唯一值的向量,并根据您需要替换的值对其进行命名,并且使用[
更快地替换整个矢量。
unname(setNames( c('A', 'A1', 'A1', 'A1', 'A1', 'A1', 'A2', 'A1'),
unique(v))[as.character(v)])
#[1] "A" "A1" "A1" "A1" "A1" "A1" "A1" "A1" "A1" "A1" "A1" "A1" "A2" "A1"
根据OP对@ agstudy帖子的评论,如果要替换的值存储在几个向量中,可能的data.table
解决方案如下所示。假设“q”向量中与“v”匹配的相应值应替换为“A”,“w”中的相应值替换为“A1”,其余值替换为“A2”。在这里,我在“v”列表上使用data.table
创建setDT
,并使用“A2”预设矢量“V2”。将“V1”列设置为键(setkey
),加入“q”,将相应的“V2”值指定为“A”,类似地将“w”指定。
q <- c(3,7,6,9,8)
w <- c(4,14)
library(data.table)
setkey(setDT(list(v, V2=rep('A2', length(v)))),
V1)[J(q), V2:='A'][J(w), V2:='A1']$V2
#[1] "A2" "A" "A1" "A2" "A2" "A" "A" "A" "A" "A" "A" "A" "A" "A2"
答案 1 :(得分:2)
使用向量化的ifelse
,这应该更快(至少对于给定的示例):
ifelse(v < 2 ,'A',ifelse(v < 10, 'A1', 'A2'))
[1] "A1" "A1" "A1" "A1" "A1" "A1" "A1" "A1" "A1" "A1" "A1" "A1" "A2" "A1"
ifelse(v %in% vA ,'A',ifelse(v %in% vA1, 'A1', 'A2'))
其中vA
和vA1
是一些向量,例如:
vA <- c(3,7,6,9,8)
vA1 <- c(4)