2016-04-04 88 views
3

愚蠢的例子:R`unique`總是以相同的順序返回值嗎?

df <- data.frame(group=rep(LETTERS, each=2), value=1:52) 
res <- unlist(lapply(unique(df$group), function(x) mean(subset(df, group==x)$value))) 
names(res) <- unique(df$group) 

res永遠是?

A B C D E F G H I J K L M N O P 
1.5 3.5 5.5 7.5 9.5 11.5 13.5 15.5 17.5 19.5 21.5 23.5 25.5 27.5 29.5 31.5 
    Q R S T U V W X Y Z 
33.5 35.5 37.5 39.5 41.5 43.5 45.5 47.5 49.5 51.5 

或者是否會發生在第2行計算的平均值不符合第3行的名稱?我想這取決於R基地的unique的底層實施,但我不確定在哪裏可以找到。

+5

我相信它會返回它們在它們出現在原始載體的順序,但文檔不_explicitly_保證這(雖然它有點暗示),所以如果你願意承擔小你可以假設我認爲有多大的風險。 – joran

+0

可能重複的[唯一()保持秩序?](http://stackoverflow.com/questions/20260835/does-unique-preserve-order) – Scarabee

回答

10

根據?unique

「獨特的」返回一個矢量,數據幀或陣列狀的「x」,但是去除了 重複的元素/行。

這說明爲您提供了訂購的完整描述 - 這將是在相同的順序第一獨特元素的順序。 (我想我沒有看到@joran看到了一個不同的排序的迴旋餘地。)例如,

unique(c("B","B","A","C","C","C","B","A")) 

將導致

[1] "B" "A" "C" 

相信unique(x)一般將是相同的(但效率比)

x[!duplicated(x)] 

如果你想看看內部代碼,請參閱here:運動部件都像

k = 0; 
switch (TYPEOF(x)) { 
case LGLSXP: 
case INTSXP: 
for (i = 0; i < n; i++) 
    if (LOGICAL(dup)[i] == 0) 
    INTEGER(ans)[k++] = INTEGER(x)[i]; 
break; 

即,內部表示正是我所說的,它順序地經過矢量並填充非重複的元素。由於訂單在文檔中沒有明確保證,因此理論上這種實現可能在未來發生變化,但幾乎不可能。

對於你正在嘗試做有更簡單的成語 - [R

df <- data.frame(group=rep(LETTERS, each=2), value=1:52) 
a1 <- aggregate(df$value,list(df$group),mean) 

這將返回一個兩列數據幀,這樣你就可以使用

setNames(a1[,2],a1[,1]) 

將其轉換爲您的格式。或

library(plyr) 
unlist(daply(df,"group",summarise,val=mean(value))) 
+2

嗯,從技術上講,一個獨特元素的排序列表_is_「like」x ,但刪除了重複的元素。 ;) – joran

+1

我想我解釋文檔相同@joran - R沒有明確承諾返回他們的FIFO。集體共識對我來說已經夠好了! – fanli

相關問題