用条件重命名矢量

时间:2015-01-17 17:46:53

标签: r

有一个看起来像这样的载体

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,依此类推。

2 个答案:

答案 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"

UPDATE2

根据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'))

其中vAvA1是一些向量,例如:

vA <- c(3,7,6,9,8)
vA1 <- c(4)