2017-05-30 93 views
1

我有一個數據幀R:匹配()只返回第一次出現

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

我想根據該字符向量

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

我使用匹配安排它()來實現這一點

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

問題是,匹配只返回第一次發生ES

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

有沒有辦法從這個該命令你希望兩個「Beethovan的記錄就知道。你真的想做什麼?所以你有一個獨特的值列表,你希望其他人被排序?你如何打破關係? – MrFlick

+0

@MrFlick我猜他們可能只想重新命名'names2'列的級別,然後對數據框進行排序?但是我對「匹配」的評論感到困惑,因爲它被明確記錄爲只返回第一個匹配。 – joran

+2

也許'song.data $ names2 < - factor(song.data $ names2,levels = c('Beethovan','AdagioBarber')); song.data [order(song.data $ names2),]'? – zx8754

回答

1

您可以使用order,如@ zx8754和@Evan弗裏德蘭人士指出。

> 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的在結束了來自order的輸出。

(我不知道爲什麼sort不必因素排序的功能,但它是什麼。)