R:match()仅返回第一次出现

时间:2017-05-30 20:41:56

标签: r matching

我有一个数据框

names2 <- c('AdagioBarber','AdagioBarber', 'Beethovan','Beethovan')
Value <- c(33,55,21,54)
song.data <- data.frame(names2,Value)

我想根据这个角色载体安排它

names <- c('Beethovan','Beethovan','AdagioBarber','AdagioBarber')

我正在使用match()来实现这个

data.frame(song.data[match((names), (song.data$names2)),])

问题是匹配仅返回第一次出现

      names2            Value
3      Beethovan         21
3.1    Beethovan         21
1      AdagioBarber      33
1.1    AdagioBarber      33

1 个答案:

答案 0 :(得分:1)

您可以使用order,正如@ zx8754和@Evan Friedland指出的那样。

> name.order <- c('Beethovan','AdagioBarber')           
> song.data$names2 <- factor(song.data$names2, levels= name.order)                                              
> song.data[order(song.data$names2), ]                                                                          
        names2 Value        
3    Beethovan    21        
4    Beethovan    54        
1 AdagioBarber    33        
2 AdagioBarber    55        

基本上,factor将字符串转换为整数,并创建一个查找表,其中整数对应于哪些字符串。 levels参数指定您希望查找表的内容。没有这个论点,它只会按照出现顺序排列。

例如:

> as.numeric(factor(letters[1:5]))                                                                              
[1] 1 2 3 4 5               
> as.numeric(factor(letters[1:5], levels=c("d","b","e","a","c")))                                               
[1] 4 2 5 1 3  

注意:您需要绝对确保在name.order向量中获得所有(正确拼写的)级别,否则您最终将获得NA&#39 ; s在order的输出中。

(我不确定为什么sort无法对因子进行排序,但事实就是如此。)