0

在 RI 中,我想知道我是否可以有一个字典(在某种意义上像 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)
  }
}

如何更改maps[i][j]以获得我正在寻找的功能?

4

5 回答 5

4

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

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)
  }
}

您可以为特定的ij使用提取任何值

maps[[mykey(i,j)]]
于 2013-04-18T21:06:02.757 回答
4

这是您在 a 中执行此操作的方法data.table,这将是快速且易于扩展的:

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]

等等

于 2013-04-18T21:10:27.140 回答
3

你可以只使用一个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"

这使用带有命名键的 2d 字典样式对象来处理这种情况。键也可以是整数,尽管它们可能必须是字符而不是数字。

于 2013-04-18T20:43:46.190 回答
3

您可以使用向量列表来执行此操作。

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

也就是说,可能有更好的方法来做你想做的事情,但你没有给我们足够的背景知识。

于 2013-04-18T21:21:29.693 回答
2

R 矩阵允许您这样做。有稀疏和密集版本。我相信 tm-package 使用稀疏矩阵的变体来形成其字典的实现。这显示了如何提取矩阵 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

@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"
于 2013-04-18T20:44:15.247 回答