应用于rep()的向量上的join或outer()

时间:2013-02-26 22:53:33

标签: r

我认为这很容易,但事实证明这很难。这是一个简单的问题:我有一个名字的载体:

[1] David    David    David    Nathan   Holly    Holly    Holly    Holly   
[9] Holly    Sue      Sue      Sue      Sue      Sue      Rene     Michelle
[17] Michelle Michelle Jennie   Jennie   Jennie   Jennie  

我想创建一个索引向量,以便每个名称获得相同的索引:

[1] 1 1 1 2 3 3 3 3 3 4 4 4 4 4 5 6 6 6 7 7 7 7

我使用

获得了每个名字的编号
bar <- ddply(df, .(Rater.Name), summarize, rater.n=sum(!is.na(Rater.Name)))

我试过

lapply(bar$Rater.Name, rep(1:7, bar$rater.n))

和各种其他东西,如outer(),by()等。没有工作。我最终使用了一个笨拙的for循环,但似乎应该有更多的“R-like”方式来做到这一点。任何人都可以建议吗?

3 个答案:

答案 0 :(得分:2)

您正在寻找factor

as.numeric(factor(x))

# [1] 1 1 1 5 2 2 2 2 2 7 7 7 7 7 6 4 4 4 3 3 3 3

默认按字母顺序排序。如果您不希望这样(2代替5 Nathan,那么请执行:

as.numeric(factor(x, levels=x[!duplicated(x)]))
# [1] 1 1 1 2 3 3 3 3 3 4 4 4 4 4 5 6 6 6 7 7 7 7

答案 1 :(得分:2)

关于使用factor,我没有任何特别负面的说法,但你可以通过查看match来学习一个额外的技巧和非常有用的功能:

> dat <- scan(what="")
1:  David    David    David    Nathan   Holly    Holly    Holly    Holly   
9:  Holly    Sue      Sue      Sue      Sue      Sue      Rene     Michelle
17:  Michelle Michelle Jennie   Jennie   Jennie   Jennie  
23: 
Read 22 items
> match(dat, unique(dat))
 [1] 1 1 1 2 3 3 3 3 3 4 4 4 4 4 5 6 6 6 7 7 7 7

答案 2 :(得分:0)

首先将其转换为因子是一个技巧:

> x <- c('David', 'David', 'Lena', 'David')
> as.factor(x)
[1] David David Lena  David
Levels: David Lena
> y <- as.factor(x)
> y
[1] David David Lena  David
Levels: David Lena
> as.numeric(y)
[1] 1 1 2 1