r - 如何从两个向量(一个是键,另一个是值)在 R 中创建一个列表?

标签 r

我有两个向量,我想在 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/

相关文章:

r - 在 write 函数中 append 文本 [R]

python - 在 Python、NumPy 和 R 中创建相同的随机数序列

r - Julia 相当于 R 的 qnorm()?

r - ggplot2:图例与绘图区域重叠 - 是否可以手动调整图例位置?

r - 使用 knitr 并排插入 png 图像

r - 使用 XLConnect 的 appendWorksheet 函数向现有 Excel 表添加新行

r - 在 R 中创建函数时循环将不起作用

r - 如何在 Shiny 应用程序中监控文件系统事件

r - ggplot2 facet 中的单条垂直线

r - 使用多个内核并行运行拉丁超立方体采样