在R中从循环中创建变量
我认为我的问题对于普通的R用户来说非常简单 编辑: 我的例子可能是我真正问题的简化版本: 请参阅以下代码:在R中从循环中创建变量,r,variables,for-loop,R,Variables,For Loop,我认为我的问题对于普通的R用户来说非常简单 编辑: 我的例子可能是我真正问题的简化版本: 请参阅以下代码: library(markovchain) #create a new MC with transition matrix transitionMatrix mcStaticPool <- new("markovchain", states=c("perf", "def", "prep"), transitionMatrix=matrix(da
library(markovchain)
#create a new MC with transition matrix transitionMatrix
mcStaticPool <- new("markovchain", states=c("perf", "def", "prep"),
transitionMatrix=matrix(data=c(0.89715, 0.01475, 0.08810, 0, 1, 0, 0, 0, 1),
byrow=TRUE, nrow=3), name="StaticPool")
#display transition matrix
#print(mcStaticPool)
show(mcStaticPool)
#initially all loans are performing
initialState<-c(1,0,0)
nYears<-10
for(i in 1:nYears){
afterNYears<-initialState*(mcStaticPool^i)
print(afterNYears)
}
以下循环:
for(i in 1:10){
test<-2*(2^i)
print(test)
}
我想将其保存为一个变量,例如test2
我试过这个:
for(i in 1:10){
test<-2*(2^i)
test2 <- print(test)
}
但我希望整个序列都在test2中:
[1] 4
[1] 8
[1] 16
[1] 32
[1] 64
[1] 128
[1] 256
[1] 512
[1] 1024
[1] 2048
谢谢,
致以最良好的祝愿
蒂姆你只需这样做:
test2 <- 2^(2:11)
test2您只需执行以下操作:
test2 <- 2^(2:11)
test2一般规则:如果您发现自己在R中使用for
循环,则很可能走错了路线;)
尽可能进行矢量化
test <- 2^2:11
或者,避免每次分配内存
test <- numeric(10)
for (i in 1:10)
test[i] <- 2^(i+1)
test一般规则:如果您发现自己在R中使用了for
循环,那么您很可能走错了路线;)
尽可能进行矢量化
test <- 2^2:11
或者,避免每次分配内存
test <- numeric(10)
for (i in 1:10)
test[i] <- 2^(i+1)
test正如其他人提到的,您可以将其矢量化,但是如果您正在做一些更复杂的事情,而不是像这样进行矢量化,那么还有其他选项
当您的主要目标是基于每次迭代的结果创建向量(或矩阵或数组)时,通常使用sappy函数(或其他相关函数)而不是显式循环更好/更简单/更清晰/等等
例如:
test2 <- sapply(2:11, function(x) 2*(2^i))
test2库(microbenchmark)
>
>out正如其他人提到的,您可以将其矢量化,但是如果您正在做一些更复杂的事情,而不是像这样进行矢量化,那么还有其他选择
当您的主要目标是基于每次迭代的结果创建向量(或矩阵或数组)时,通常使用sappy函数(或其他相关函数)而不是显式循环更好/更简单/更清晰/等等
例如:
test2 <- sapply(2:11, function(x) 2*(2^i))
test2库(microbenchmark)
>
>请注意,OP正在执行2*(2^i)
,而不是(2^i)
。另外,不是test@JuliánUrbano:不,不是,它将变量连接到自身。更正了公式:)据我所知,它通过串联创建一个新值,然后将该值赋给变量test
,覆盖它以前的值,但使用更长的数组:因此本质上test等于[2],然后是[2,4],然后是[2,4,8],依此类推。应该不鼓励c(test,2^I)
方法。这需要在每次迭代中分配一个新的(更大的)向量。最好预先分配最终大小的向量,然后分配到向量中。请注意,OP执行的是2*(2^i)
,而不是(2^i)
。另外,不是test@JuliánUrbano:不,不是,它将变量连接到自身。更正了公式:)据我所知,它通过串联创建一个新值,然后将该值赋给变量test
,覆盖它以前的值,但使用更长的数组:因此本质上test等于[2],然后是[2,4],然后是[2,4,8],依此类推。应该不鼓励c(test,2^I)
方法。这需要在每次迭代中分配一个新的(更大的)向量。最好预先分配最终大小的向量,然后分配到向量中。你不能在一个向量中拥有所有这些。你是说数据帧吗?可能有三个向量,分别对应于perf
、def
、prep
?可能我不清楚,我只是想把百分比作为一个向量。应该是这样的:c(0.0881, 0.89715, 0.01475, 0.1671389, 0.8048781, 0.02798296, 0.2380487, 0.7220964, 0.03985491, 0.3016654, 0.6478288, 0.05050584, 0.3587391, 0.5811996, 0.06006131, 0.4099428, 0.5214232, 0.06863401, 0.4558802, 0.4677948, 0.076325, 0.4970929, 0.4196821, 0.08322497, 0.5340669, 0.3765178, 0.08941528, 0.5672381, 0.337793, 0.09496892)你不可能在一个向量中包含所有这些。你是说一个数据帧吗?可能有三个向量,分别对应于perf
、def
、prep
?可能我不清楚,我只想要百分比作为一个向量。应该如下所示:c(0.0881, 0.89715, 0.01475, 0.1671389, 0.8048781, 0.02798296, 0.2380487, 0.7220964, 0.03985491, 0.3016654, 0.6478288, 0.05050584, 0.3587391, 0.5811996, 0.06006131, 0.4099428, 0.5214232, 0.06863401, 0.4558802, 0.4677948, 0.076325, 0.4970929, 0.4196821, 0.08322497, 0.5340669, 0.3765178, 0.08941528, 0.5672381, 0.337793, 0.09496892)
test2 <- sapply(2:11, function(x) 2*(2^i))
> library(microbenchmark)
>
> out <- microbenchmark(
+ bad={test2 <- NULL; for(i in 1:10000) test2 <- c(test2,2*(2^i))},
+ good={test2 <- numeric(10000); for(i in 1:10000) test2[i] <- 2*(2^i) },
+ better={test2=sapply(1:10000, function(x) 2*(2^x))},
+ best={test2=2*(2^(1:10000))} )
> out
Unit: microseconds
expr min lq median uq max neval
bad 172508.454 174738.8165 176630.910 197765.369 211581.875 100
good 26387.491 27683.0960 28150.475 28567.769 52588.194 100
better 20645.118 21288.8155 22140.853 23022.652 49513.799 100
best 719.234 763.1595 768.086 773.628 1622.381 100
> plot(out)
>