更新R中列表中的几个data.tables(或data.frames)的行

时间:2013-09-24 05:37:53

标签: r list dataframe data.table plyr

我正在尝试在R中构建一个(高效的)基于代理的模型。每个代理都在列表中的data.table中捕获信息。有没有比我更有效的方法来做到这一点?这是一些简化的代码:

require(data.table)

# Setup simulation
numAgents <- 5
numIterations <- 10

# Create collection of agents which have a property someValue that we want to track through the simulation
agents <- vector("list", numAgents)

for(i in 1:numAgents) {
  agents[[i]] <- data.table(someValue1 = rep(as.integer(NA), numIterations), someValue2 = rep(as.integer(NA), numIterations))
}

# Iterate through simulation
for(i in 1:numIterations) {
  # Generate values for someValue1, someValue2 for the agents
  #   Note: This is just to give an idea of what will be involved
  #   Note2: The values depend upon history and other agents
  agentValues1 <- lapply(agents, function(x) {
                                   sum(x[, median(someValue1, na.rm = TRUE)], round(runif(1)), na.rm = TRUE)
                                 })
  agentValues2 <- ifelse(runif(numAgents) < as.integer(agentValues1)/max(as.integer(agentValues1)), 1, 0)

  # Update the agents history (I'm trying to optimize this)
  for(k in 1:numAgents) {
    set(agents[[k]], i, j = "someValue1", as.integer(agentValues1[k]))
    set(agents[[k]], i, j = "someValue2", as.integer(agentValues2[k]))
  }
}

不建议不使用data.tables列表,但可能会扩大问题的范围。

作为注释,值生成过程涉及(1)代理的多个属性(例如,someValue1和someValue2)(2)这些属性的历史,以及(3)其他代理的行为。它没有反映在示例代码中(尚未),因为我没有想到一种简单的方法来反映它......我会尽快更新。


[编辑]代码修订为包括多个代理属性和样本值生成,这些属性都是历史记录和其他依赖于代理的。示例代码中的值生成过程本质上没有意义,但它是为了说明实际代码中的依赖类型。

1 个答案:

答案 0 :(得分:0)

您可能会发现最好使用矩阵来存储代理值:

numAgents <- 5
numIterations <- 10

agents <- matrix(NA, nrow=numAgents, ncol=numIterations)

for(i in 1:numIterations) {
  agentValues <- as.integer(ceiling(runif(numAgents)*10))
  agents[,i] <- agentValues
}