R`unique`总是以相同的顺序返回值吗?

时间:2016-04-04 21:43:49

标签: 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的底层实现,但我不知道在哪里找到它。

2 个答案:

答案 0 :(得分:12)

根据?unique

  

'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;

即,内部表示正是我所说的,它依次遍历向量并填充非重复元素。由于在文档中没有明确保证订购,理论上 可能会在未来改变这种实现,但几乎不可能实现。

对于你想要做的事情,有更简单的习语

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)))

答案 1 :(得分:1)

如果在RasterLayer对象上调用了unique,R将返回排序后的向量。

example <- raster(xmn = 0, xmx = 100, ymn = 0, ymx = 100, nrow = 100, ncol = 100)
example[] <- sample(x <- 1:100, 10000, replace = TRUE)

plot(example)

vals <- values(example)[x]
identical(vals, x)

uniques <- unique(example)
identical(uniques, x)

这些值(很有可能)与有序向量不相同,但是唯一值将始终与有序向量相同。

否则,先前的答案是正确的,R将返回非重复出现顺序的向量。