我有两个向量,我想在R中创建一个列表,其中一个向量是键,另一个是值.我以为我会在我的书中轻松找到答案或googleing并且我期待找到一个解决方案,比如在向量中添加名称(名称(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]}
Run Code Online (Sandbox Code Playgroud)
我的解决方案2:通过命名向量的间接路径:
> names(xx) <- letters[1:3]
> as.list(xx)
Run Code Online (Sandbox Code Playgroud)
似乎我有一个解决方案,但我的矢量有100万或更多的元素,我不仅担心编码风格(对我很重要)而且还担心效率(但我不知道如何在R中进行分析).有没有更合适的方法呢?使用指定的矢量快捷方式是一个好习惯吗?
[[更新]]我的applogies,可能我过于简化了问题,使其可重现.我想给列表的元素命名.我首先尝试了names(),但似乎我做错了什么并且没有用.所以我错误地认为names()不适用于列表.但他们确实如接受的答案所示
我有一个两列的数据框:键和值,我想使用每列的相应行为字典/哈希表的每个元素创建一个字典.
据我所知,使用R字典/散列表的典型方法是做类似的事情.
labels.dic <- c("Id of the item and some other description" = "id")
Run Code Online (Sandbox Code Playgroud)
这很好用,但是当我尝试使用数据框中的值(在示例中命名为lbls)时,它不起作用.为什么会这样?
labels.dic <- c(lbls[1,1]=lbls[1,2])
Error: unexpected '=' in "c(lbls[1,1] ="
Run Code Online (Sandbox Code Playgroud) 我经常遇到的一个问题是需要从data.table中查找任意行.昨天我遇到了一个问题,我试图加速循环并使用profvis我发现从中查找data.table是循环中最昂贵的部分.然后我决定尝试找到在R中进行单项查找的最快方法.
数据通常采用data.table带有字符类型的键列的a形式.其余列通常是数值.我试图创建一个随机表,其特征与我经常处理的相似,这意味着> 100K行.我比较了本机列表,data.table包和hash包.本机列表与data.table单个项目查找性能相当.Hash似乎快了两个数量级.测试由随机抽样的10组10,000个密钥组成,以提供访问行为的变化.每种查找方法都使用相同的密钥集.
最终我的首选是要让data.table的行查找更快,而不是必须创建我的数据的哈希表,或者确定它不能完成,只需在我必须快速查找时使用哈希包.我不知道是否可能,但是你可以创建一个对data.table中行的引用的哈希表,以允许使用哈希包快速查找吗?我知道在C++中可以使用这种类型的东西,但据我所知,由于缺少指针,R不允许这种事情.
总结一下:1)我是否正确地使用data.table进行查找,因此这是单行查找所需的速度?2)是否可以创建指向data.table行的指针散列,以便以这种方式快速查找?
Windows 10 Pro x64
R 3.2.2
data.table 1.9.6
哈希2.2.6
Intel Core i7-5600U,16 GB RAM
library(microbenchmarkCore) # install.packages("microbenchmarkCore", repos="http://olafmersmann.github.io/drat")
library(data.table)
library(hash)
# Set seed to 42 to ensure repeatability
set.seed(42)
# Setting up test ------
# Generate product ids
product_ids <- as.vector(
outer(LETTERS[seq(1, 26, 1)],
outer(outer(LETTERS[seq(1, 26, 1)], LETTERS[seq(1, 26, 1)], paste, sep=""),
LETTERS[seq(1, 26, 1)], paste, sep = "" …Run Code Online (Sandbox Code Playgroud) 我有一个字符串向量,如
sv = c('xx_S1_xx', 'xx_S1_xx', 'xx_S2_xx', 'xx_S3_xx', ...)
Run Code Online (Sandbox Code Playgroud)
但是我很难找到一个类似字典的结构,所以我可以将它转换为
map = { S1=>c('xx_S1_xx', 'xx_S1_xx'), S2=>c('xx_S2_xx'), S3=>c('xx_S3_xx'), ... }
Run Code Online (Sandbox Code Playgroud)
有什么建议?
我需要将整数映射到 R 中的整数。在 python 中,这是字典的工作
>>> a = { 4: 1, 5: 2, 6:3 }
>>> a[5]
2
Run Code Online (Sandbox Code Playgroud)
但在 R 中不存在这样的东西。向量不起作用:
a<- c(1,2,3)
> a
[1] 1 2 3
> names(a) <- c(5,6,7)
> a
5 6 7
1 2 3
> a[[5]]
Error in a[[5]] : subscript out of bounds
Run Code Online (Sandbox Code Playgroud)
列表也不起作用
> a<- list(1,2,3)
> a
[[1]]
[1] 1
[[2]]
[1] 2
[[3]]
[1] 3
> names(a) <- c(4, 5, 6)
> a
$`4`
[1] 1
$`5`
[1] 2 …Run Code Online (Sandbox Code Playgroud)