我有两个向量,我想在 R 中创建一个列表,其中一个向量是键,另一个是值。我以为我会很容易地在我的书或谷歌搜索中找到答案,我期待找到一个解决方案,比如向向量添加名称时(names(v)<-names_vector),但我失败了。
我自己提出了两种可能的解决方案,但对我来说它们都不是优雅的。 R 不是我的主要编程语言,但我认为 R 如此务实,应该存在更好的解决方案(类似于 list(keys=x, values=y))。
我的解决方案1:经典循环解决方案:
> xx <- 1:3
> yy <- letters1:3
> zz =list()
>for(i in 1:length(yy)) {zz[[yy[i]]]<-xx[i]}
我的解决方案 2:通过命名向量的间接路径:
> names(xx) <- letters[1:3]
> as.list(xx)
似乎我有一个解决方案,但我的向量有 100 万个或更多元素,我不仅担心编码风格(对我很重要)而且担心效率(但我不知道如何在 R 中进行分析)。有没有更合适的方法来做到这一点?使用命名向量快捷方式是一个好习惯吗?
[[更新]] 我的应用程序,可能我把问题简单化了以使其可重现。我想给列表的元素命名。我首先尝试了 names() 但似乎我做错了什么并且没有工作。所以我错误地认为 names() 不适用于列表。但他们确实如接受的答案所示
最佳答案
如果您的值都是标量,那么拥有一个只是向量的“键值存储”并没有错。
vals <- 1:1000000
keys <- paste0("key", 1:1000000)
names(vals) <- keys
然后,您可以检索与给定键对应的值
vals["key42"]
[1] 42
IIRC R 使用散列进行基于字符的索引,因此无论向量的大小如何,查找都应该很快。
如果您的值可以是任意对象,那么您确实需要一个列表。
vals <- list(1:100, lm(speed ~ dist, data=cars), function(x) x^2)
names(vals) <- c("numbers", "model", "function")
sq <- vals[["function"]]
sq(5)
[1] 25
如果您的问题是关于构建列表,我不会太担心。 R 内部是写时复制(对象仅在其内容被修改时才被复制),因此执行类似的操作
vals <- list(1:1000000, 1:1000000, <other big objects>)
实际上不会制作所有内容的额外副本。
编辑:我刚刚检查过,如果您这样做,R 将复制所有内容
lst <- list(....)
.去搞清楚。因此,如果您已经接近机器上的内存限制,这将不起作用。另一方面,如果你这样做 names(lst) <- ....
,它不会复制 lst
.再去图。
关于r - 如何从两个向量(一个是键,另一个是值)在 R 中创建一个列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17504241/