R 字典和配对

R 字典和配对,r,dictionary,keyvaluepair,R,Dictionary,Keyvaluepair,在R中,我想知道是否可以有一个字典(在某种意义上类似于python),其中我有一对(I,j)作为具有相应整数值的键。我还没有在R中看到一种干净或直观的方法来构造它。我的词典的可视版本是: (1,2)-->1 (1,3)-->3 (1,4)-->4 (1,5)-->3 编辑:插入这些键值对的代码行与计数器i和j在一个循环中。例如,假设我有: for(i in 1: 5) { for(j in 2: 4) { maps[i][j] = which.min(someVector)

在R中,我想知道是否可以有一个字典(在某种意义上类似于python),其中我有一对
(I,j)
作为具有相应整数值的键。我还没有在R中看到一种干净或直观的方法来构造它。我的词典的可视版本是:

(1,2)-->1

(1,3)-->3

(1,4)-->4

(1,5)-->3

编辑:插入这些键值对的代码行与计数器i和j在一个循环中。例如,假设我有:

for(i in 1: 5)
{  
  for(j in 2: 4)
  {
    maps[i][j] = which.min(someVector)
  }
}

如何更改
映射[I][j]
以获得我正在寻找的功能?

您可以使用data.frame:

a = data.frame(spam = c("alpha", "gamma", "beta"), 
               shrub = c("primus","inter","parus"),
               stringsAsFactors = FALSE)
rownames(a) = c("John", "Eli","Seth")
> a
      spam  shrub
John alpha primus
Eli  gamma  inter
Seth  beta  parus

>     a["John", "spam"]
[1] "alpha"

这将处理具有命名键的二维字典样式对象的情况。键也可以是整数,尽管它们可能必须是字符而不是数字。

R矩阵允许您这样做。有稀疏版本和密集版本。我相信tm软件包使用了稀疏矩阵的一种变体来实现字典。这显示了如何提取矩阵M的[i,j]元素,其中[i,j]表示为两列矩阵

M<- matrix(1:20, 5, 5)
ij <- cbind(sample(1:5), sample(1:5) )

> ij
     [,1] [,2]
[1,]    4    4
[2,]    1    2
[3,]    5    3
[4,]    3    1
[5,]    2    5
> M[ij]
[1] 19  6 15  3  2
M[ij]
[1] 19  6 15  3  2
@Justin还指出,您可以使用可以按位置索引的列表:

 L <- list( as.list(letters[1:5] ), as.list( paste(2,letters[1:5] ) ) )

> L[[1]][[2]]
[1] "b"
> L[[2]][[2]]
[1] "2 b"
L[[1][[2]]
[1] “b”
>L[[2]][[2]]
[1] “2 b”

命名列表和环境都提供了一个映射,但映射是在字符串(名称,用作键)和任意R对象(值)之间进行的。如果您的
i
j
很简单(在您的示例中,它们看起来是整数),您可以通过使用一些分隔符将它们连接起来,轻松地从它们对中生成一个唯一的字符串。这将生成有效的名称/密钥

mykey <- function(i, j) {
  paste(i, j, sep="|")
}

maps <- list()
for(i in 1: 5) {  
  for(j in 2: 4) {
    maps[mykey(i,j)] <- which.min(someVector)
  }
}

以下是如何在
数据表
中执行此操作,该表将快速且易于扩展:

library(data.table)
d = data.table(i = 1, j = 2:5, value = c(1,3,4,3), key = c("i", "j"))

# access the i=1,j=3 value
d[J(1, 3)][, value]

# change that value
d[J(1, 3), value := 12]

# do some vector assignment (you should stop thinking loops, and start thinking vectors)
d[, value := i * j]

等等。

您可以使用向量列表来完成此操作

maps <- lapply(vector('list',5), function(i) integer(0))
maps[[1]][2] <- 1
maps[[1]][3] <- 3
maps[[1]][4] <- 4
maps[[1]][5] <- 3

映射是否允许我们假设,
i
j
都是整数?如果是这样,您可以只使用多维数组。在这种情况下,只需要一个2D(矩阵)。其R结构是
data.frame
data.table
是的,也可以仅使用整数和整数之间的映射来实现它。或者列表:
x=list('2'=3,'1'=4);x['1']];x$'1'
这很有趣,请查看我的编辑。我想知道当您的键被用作循环中的索引变量时,或者您可以使用向量列表:
list(c(0,1,3,4,3))
@JoshuaUlrich如何查找,那么?这是最好的答案,因为它可以推广到任何数量的维度,并且没有任何关于存储元素数量的初始假设。
maps <- lapply(vector('list',5), function(i) integer(0))
maps[[1]][2] <- 1
maps[[1]][3] <- 3
maps[[1]][4] <- 4
maps[[1]][5] <- 3