在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)
}
}
如何更改maps[i][j]
以获取我要查找的功能?
答案 0 :(得分:4)
命名列表和环境都提供映射,但在字符串(名称,作为键)和任意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)
}
}
您可以使用
为特定i
和j
提取任何值
maps[[mykey(i,j)]]
答案 1 :(得分:4)
以下是您在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]
等
答案 2 :(得分: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字典样式对象来处理这种情况。键也可以是整数,但它们可能必须是字符而不是数字。
答案 3 :(得分: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
那就是说,你可能有更好的方法去做你想做的事,但是你没有给我们足够的背景。
答案 4 :(得分: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"