【问题标题】:Does R `unique` always return values in same order?R `unique` 是否总是以相同的顺序返回值?
【发布时间】:2016-04-04 21:43:48
【问题描述】:

愚蠢的例子:

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 的底层实现,但我不确定在哪里可以找到它。

【问题讨论】:

  • 我相信它会按照它们在原始向量中出现的顺序返回它们,但文档并没有明确承诺这一点(尽管它有点暗示)所以如果你愿意承担我认为可以承担的少量风险。

标签: r unique


【解决方案1】:

根据?unique

‘unique’返回一个向量、数据框或数组,如‘x’,但带有 删除了重复的元素/行。

此描述为您提供了完整的排序描述——它将与 first 唯一元素的顺序相同。 (我想我没有看到 @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)))

【讨论】:

  • 嗯,从技术上讲,唯一元素的排序列表“类似”x,但删除了重复元素。 ;)
  • 我想我将文档解释为与@joran 相同 - R 没有明确承诺将它们返回 FIFO。集体共识对我来说已经足够了!
【解决方案2】:

如果对 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 将返回非重复出现顺序的向量。

【讨论】:

    猜你喜欢
    • 2016-06-07
    • 1970-01-01
    • 2016-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    相关资源
    最近更新 更多