gpt4 book ai didi

list - 从列表中查找唯一值

转载 作者:行者123 更新时间:2023-12-03 09:56:41 25 4
gpt4 key购买 nike

假设您有一个值列表

x <- list(a=c(1,2,3), b = c(2,3,4), c=c(4,5,6))

我想从所有合并的列表元素中找到唯一的值。到目前为止,以下代码可以解决问题
unique(unlist(x))

有谁知道更有效的方法?我列出了很多有值(value)的东西,希望您能加快速度。

最佳答案

Marek建议的此解决方案是对原始Q的最佳回答。有关其他方法以及Marek为什么最有用的讨论,请参见下文。

> unique(unlist(x, use.names = FALSE))
[1] 1 2 3 4 5 6

讨论区
更快的解决方案是先对 unique()的组件计算 x,然后对这些结果进行最终的 unique()。仅当列表的组件具有相同数量的唯一值时,这才起作用,就像下面两个示例中一样。例如。:
首先是您的版本,然后是我的双重独特方法:
> unique(unlist(x))
[1] 1 2 3 4 5 6
> unique.default(sapply(x, unique))
[1] 1 2 3 4 5 6
我们必须调用 unique.default,因为 matrix有一个 unique方法,该方法可以固定一个边距;这很好,因为矩阵可以视为 vector 。
Marek在对此答案的评论中指出, unlist方法的速度较慢,可能是由于列表上的 names所致。 Marek的解决方案是利用 use.namesunlist参数,如果使用该参数,则比上述双唯一版本的解决方案更快。对于Roman帖子的简单 x,我们得到
> unique(unlist(x, use.names = FALSE))
[1] 1 2 3 4 5 6
即使组件之间的唯一元素数量不同,Marek的解决方案也将起作用。
这是一个较大的示例,其中包含所有三种方法的一些计时:
## Create a large list (1000 components of length 100 each)
DF <- as.list(data.frame(matrix(sample(1:10, 1000*1000, replace = TRUE),
ncol = 1000)))
这是使用 DF的两种方法的结果:
> ## Do the three approaches give the same result:
> all.equal(unique.default(sapply(DF, unique)), unique(unlist(DF)))
[1] TRUE
> all.equal(unique(unlist(DF, use.names = FALSE)), unique(unlist(DF)))
[1] TRUE
> ## Timing Roman's original:
> system.time(replicate(10, unique(unlist(DF))))
user system elapsed
12.884 0.077 12.966
> ## Timing double unique version:
> system.time(replicate(10, unique.default(sapply(DF, unique))))
user system elapsed
0.648 0.000 0.653
> ## timing of Marek's solution:
> system.time(replicate(10, unique(unlist(DF, use.names = FALSE))))
user system elapsed
0.510 0.000 0.512
这表明,将 unique应用于各个组件,然后再将 unique()应用于较小的唯一值集,双 unique()的速度要快得多,但是这种加快的原因完全是列表 names上的 DF。如果我们告诉 unlist不使用 names,那么针对此问题,Marek的解决方案比双 unique快一点。由于Marek的解决方案正确使用了正确的工具,并且比解决方法要快,因此是首选解决方案。
unique方法的最大难题是,只有,它才可以工作 ,如此处的两个示例一样,输入列表的每个组件(DFx)具有相同数量的唯一值。在这种情况下,sapply将结果简化为一个矩阵,使我们可以应用unique.default。如果输入列表的组件具有不同数量的唯一值,则双重唯一解决方案将失败。

关于list - 从列表中查找唯一值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3879522/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com