愚蠢的例子:
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
的底层实现,但我不知道在哪里找到它。
答案 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将返回非重复出现顺序的向量。