(编辑)的
我使用以下代码在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]) ]
}
答案 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]