Как выбрать лист Excel, используя для цикла в R

Я хочу, чтобы приложение, которое я разрабатываю, автоматически переходило на лист Excel и вычисляло матрицу вероятности перехода.

 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

Как я могу исправить эту проблему.

1 ответ

Решение

Итак, чтобы расширить на комментарии...

У вас есть два кадра данных 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-loop:

sapply(lis, nrow)
for (i in 1:length(lis)) nrow(lis[[i]])

2. Используйтеget

Другой вариант заключается в использовании get, который позволяет вам предоставить строку и впоследствии вернет переменную, описанную в этой строке.

vec <- c("em1","em2")
sapply(vec, function(x) nrow(get(x)))

Обратите внимание, что с помощью get как правило, не рекомендуется. Я также выбрал бы первый вариант вместо этого.

Другие вопросы по тегам