select excel sheet 如何在 R 中使用 for 循环
How select the excel sheet using for loop in R
我希望我正在开发的应用自动转到 excel sheet 并计算转移概率矩阵。
action<-actions
state<-states
p<-array(0,c(length(state),length(state),length(action)))
colnames(p)=state
rownames(p)=state
# transition probability matrix based on the action that we have choosen
empiricala1<-read.xlsx("www/dynamic model.xlsx",1)
empiricala2<-read.xlsx("www/dynamic model.xlsx",2)
#show(empirical) calculate transition probability from historical data
em1<-as.data.frame(empiricala1)
em2<-as.data.frame(empiricala2)
tab1 <- table(em1)
tab2 <- table(em2)
tab1<-addmargins(prop.table(table(em1$current,em1$nextstate),1),2)
tab2<-addmargins(prop.table(table(em2$current,em2$nextstate),1),2)
transitionprob1<-p[,,1]<-prop.table(table(em1$current,em1$nextstate),1)
transitionprob2<-p[,,2]<-prop.table(table(em2$current,em2$nextstate),2)
print(transitionprob1)
print(transitionprob2)
for(i in 1:length(action)){
p[,,i]<-prop.table(table(em[i]$current,em[i]$nextstate),i)
}
我得到的错误如下:
Error in em[i] : object of type 'closure' is not subsettable
我该如何解决这个问题。
好的,所以要扩展评论...
您有两个数据框 em1
和 em2
。您似乎想对两个数据框应用相同的操作(例如 table(em1)
和 table(em2)
。这写起来真的很乏味,尤其是当您获得更多变量时。
您尝试做的是:
for (i in 1:2) em[i]
问题是您没有得到 em1
和 em2
。相反,您得到 em[1]
和 em[2]
,因此指的是 em
对象(一开始并不存在)。
有几种方法可以解决这个问题。
1.将数据帧移动到列表
lis <- list(em1, em2)
这样,您可以使用 *apply
系列或 for
循环遍历列表:
sapply(lis, nrow)
for (i in 1:length(lis)) nrow(lis[[i]])
2。使用 get
另一种选择是使用 get
,它允许您提供一个字符串,随后它将 return 该字符串中描述的变量。
vec <- c("em1","em2")
sapply(vec, function(x) nrow(get(x)))
请注意,通常不鼓励使用 get
。我也会选择第一个选项。
我希望我正在开发的应用自动转到 excel sheet 并计算转移概率矩阵。
action<-actions
state<-states
p<-array(0,c(length(state),length(state),length(action)))
colnames(p)=state
rownames(p)=state
# transition probability matrix based on the action that we have choosen
empiricala1<-read.xlsx("www/dynamic model.xlsx",1)
empiricala2<-read.xlsx("www/dynamic model.xlsx",2)
#show(empirical) calculate transition probability from historical data
em1<-as.data.frame(empiricala1)
em2<-as.data.frame(empiricala2)
tab1 <- table(em1)
tab2 <- table(em2)
tab1<-addmargins(prop.table(table(em1$current,em1$nextstate),1),2)
tab2<-addmargins(prop.table(table(em2$current,em2$nextstate),1),2)
transitionprob1<-p[,,1]<-prop.table(table(em1$current,em1$nextstate),1)
transitionprob2<-p[,,2]<-prop.table(table(em2$current,em2$nextstate),2)
print(transitionprob1)
print(transitionprob2)
for(i in 1:length(action)){
p[,,i]<-prop.table(table(em[i]$current,em[i]$nextstate),i)
}
我得到的错误如下:
Error in em[i] : object of type 'closure' is not subsettable
我该如何解决这个问题。
好的,所以要扩展评论...
您有两个数据框 em1
和 em2
。您似乎想对两个数据框应用相同的操作(例如 table(em1)
和 table(em2)
。这写起来真的很乏味,尤其是当您获得更多变量时。
您尝试做的是:
for (i in 1:2) em[i]
问题是您没有得到 em1
和 em2
。相反,您得到 em[1]
和 em[2]
,因此指的是 em
对象(一开始并不存在)。
有几种方法可以解决这个问题。
1.将数据帧移动到列表
lis <- list(em1, em2)
这样,您可以使用 *apply
系列或 for
循环遍历列表:
sapply(lis, nrow)
for (i in 1:length(lis)) nrow(lis[[i]])
2。使用 get
另一种选择是使用 get
,它允许您提供一个字符串,随后它将 return 该字符串中描述的变量。
vec <- c("em1","em2")
sapply(vec, function(x) nrow(get(x)))
请注意,通常不鼓励使用 get
。我也会选择第一个选项。