更新R

时间:2017-05-13 22:39:34

标签: r data.table

(编辑)的

我使用以下代码在data.table中创建两列,并使用一些数字更新它们:

T <- data.table(Init_1 = rep(0, 100), Init_2 = rep(0, 100))

for (i in 1:100){
  T[, Init_1 := i]
  T[, Init_2 := 2*i]
}

我希望这段代码会在data.table T(Init_1和Init_2)中添加两列,并用数字填充它们:(1:100)和(2,4,... 200)。

但是,代码返回常量值:

     > T
   Init_1 Init_2
  1:    100    200
  2:    100    200
  3:    100    200
  4:    100    200
  5:    100    200
  6:    100    200
  7:    100    200
  8:    100    200
.................

你能解释为什么我的代码没有按预期工作以及如何修复它吗?

您的建议将不胜感激。

编辑:

关于答案2,最终我想在for循环中使用一个函数。更具体地说:

# A FUNCTION THAT RETURNS THE TRANSITION PROBABILITIES AFTER N STEPS IN A MARKOV CHAIN
#-------------------------------------------------------------------------------------
R <- function(P, n){
  if (n==1) return(P)
  R(P, n-1) %*% P

}

# A ONE-STEP PROBABILITY MATRIX
#---------------------------------------------------------------------------------------
P = matrix(c(0.6, 0.1, 0.3, 0.2, 0.7, 0.1, 0.3, 0.3, 0.4), nrow = 3, byrow = TRUE)

# EXAMINING THE CONVERGENCE PROCESS OF THE PROBABILITIES OVER TIME
#########################################################################
T <- data.table(Init_1 = rep(0, 100), Init_2 = rep(0, 100))

for (i in 1:100){
  T[, Init_1 := R(P, i)[1,1]]
  T[, Init_2 := R(P, i)[2,1]]
}

   for (i in 1:100){
      T[, ':=' (Init_1 = R(P, i)[1,1],
                Init_2 = R(P, i)[2,1]) ]
    }

2 个答案:

答案 0 :(得分:1)

我不是data.table专家。但我知道它会抛出 有用的错误消息。如果你是创建一个空的data.table和 尝试使用:=添加列,它说

T <- data.table()
T[,a:=1]
# Error in `[.data.table`(T, , `:=`(a, 1)) : 
#   Cannot use := to add columns to a null data.table (no columns), currently. 
#   You can use := to add (empty) columns to a 0-row data.table (1 or more empty columns), 
#   though.

您的问题可能与此有关。因为data.table(numeric())或更确切地说T <- data.table(numeric(length = 0))创建了一个0行data.table。默认情况下,空列名为V1。在这里你可以使用 :=添加空列。但是,这不是你想要的。

相反,你可以做到

T <- data.table(numeric(0))
for (i in 1:5){
  T <- T[, .(
    Init_1=if (exists("Init_1")) c(Init_1, i) else i, 
    Init_2=if (exists("Init_2")) c(Init_2, 2*i) else  2*i )]
}
T
#    Init_1 Init_2
# 1:      1      2
# 2:      2      4
# 3:      3      6
# 4:      4      8
# 5:      5     10

虽然这很丑陋但可能超级低效。

答案 1 :(得分:0)

首先,您不应该将名称定义为T的函数定义为T.逻辑中保留为TRUE。此外,不建议使用i进行迭代,因为它也用于复数,例如

> (2i)^2
[1] -4+0i

第三,R中的迭代很慢。我们应该尽可能避免使用迭代。

以下是生成此类矩阵的简单代码。希望这可以帮助。

T.data <- matrix(NA,nrow=100,ncol=2);
T.data[,1] <- 1:100;
T.data[,2] <- 2*T.data[,1]