Программа, которая вводит наблюдение в вектор на основе пересечения трех наблюдений - PullRequest
1 голос
/ 18 марта 2020

Здравствуйте. У меня возникли проблемы с поиском решения для программы, которую я писал, и я мог бы использовать некоторую поддержку.

Цель - создать новый параметр с именем Lambda для каждого человека в моем наборе данных. Лямбда является функцией 3 наблюдений, найденных в Df_obvs: Row, OAlpha, OSigma.

Row определяет data.frame, используемый для поиска Lambda, в то время как наблюдения OSigma и OAlpha идентифицируют строку и столбец, которые идентифицируют отдельный параметр Lambda. Существует 3 возможных варианта «Row»: 1, 2 и 3, поэтому есть 3 возможных фрейма данных: Row1, Row2 и Row3. В моей реальной задаче важно указать Row1 [1,1]! = Row2 [1,1], однако для этого примера вы заметите, что Row1 = Row2 = Row3.

#create observation matrix
Names<-c('Bob','Jane','Sue')
Row<-c(1,2,3)
OAlpha<-c(.05,.75,1.5)
OSigma<-c(.1,.9,1.4)
Df_obvs<-cbind.data.frame(Names,OAlpha,OSigma,Row)

Создание фреймов данных, используемых для определения параметров лямбда.

Switch<-data.frame(replicate(30,sample(0:8,30,rep=TRUE)))
alpha<-seq(.05,1.5,.05)
sigma<-seq(.05,1.5,.05)
colnames(Switch)<-alpha
rownames(Switch)<-sigma

Row1<-Switch
Row2<-Switch
Row3<-Switch

В этом моя проблема. Я хотел бы, чтобы программа проверила наблюдения отдельных лиц для строки, чтобы определить, какой фрейм данных (строка 1, строка 2 или строка 3) использовать для определения лямбды. Затем используйте наблюдения OSigma и OAlpha, чтобы найти точную ячейку в кадре данных и установить Lambda [j] равной этому.

final_lambda<- matrix(NA,3,1)
for (j in 1:length(Df_obvs[,1])){
       if (Df_obvs$Row[j]==1) {Lambda[j]<-sapply(1:nrow(Df_obvs), function(i){Row1[Df_obvs$OSigma[i],Df_obvs$OAlpha[i]]})}
  else if (Df_obvs$Row[j]==2) {Lambda[j]<-sapply(1:nrow(Df_obvs), function(i){Row2[Df_obvs$OSigma[i],Df_obvs$OAlpha[i]]})}
  else                        {Lambda[j]<-sapply(1:nrow(Df_obvs), function(i){Row3[Df_obvs$OSigma[i],Df_obvs$OAlpha[i]]})}}

Я ценю ваше время и с нетерпением жду возможности увидеть, где я иду не так. Пожалуйста, дайте мне знать, если я должен что-то уточнить.

1 Ответ

1 голос
/ 18 марта 2020

Если я правильно понял, следующий код должен делать то, что вы хотите достичь. Basi c idea:

  1. Поместите ваши Row-dfs в список (списки всегда хороши, если у вас есть куча похожих dfs) ​​
  2. Преобразуйте OAlpha и OSigma в символы для индексирование Row-dfs по имени и имени строки
  3. Получить значение лямбда-выражения для каждого отдельного человека (которое я бы просто поместил в df как другую переменную)
set.seed(42)

# Set up Switch
Switch<-data.frame(replicate(30,sample(0:8,30,rep=TRUE)))
alpha<-seq(.05,1.5,.05)
sigma<-seq(.05,1.5,.05)
colnames(Switch)<-alpha
rownames(Switch)<-sigma

Row1<-Switch
Row2<-Switch
Row3<-Switch

# Put the dfs in a list
Rows <- list(Row1, Row2, Row3)

# Set up Df_obvs
Df_obvs <- data.frame(
  Names = c("Bob", "Jane", "Sue"),
  Row = c(1, 2, 3),
  OAlpha = c(.05, .75, 1.5),
  OSigma = c(.1, .9, 1.4)
)
# Convert to character for indexing
Df_obvs$OAlpha <- as.character(Df_obvs$OAlpha)
Df_obvs$OSigma <- as.character(Df_obvs$OSigma)

# Get Lambda values coresponding to df Row, OAlpha, OSigma

# Using temporary variables 
Df_obvs$Lambda <- sapply(1:nrow(Df_obvs), function(j) {
  Row <- Rows[[ Df_obvs$Row[[j]] ]]
  sigma <- Df_obvs$OSigma[[j]]
  alpha <- Df_obvs$OAlpha[[j]]
  Row[sigma, alpha]
})
Df_obvs
#>   Names Row OAlpha OSigma Lambda
#> 1   Bob   1   0.05    0.1      4
#> 2  Jane   2   0.75    0.9      0
#> 3   Sue   3    1.5    1.4      4

# As a one liner
Df_obvs$Lambda1 <- sapply(1:nrow(Df_obvs), function(j) Rows[[ Df_obvs$Row[[j]] ]][Df_obvs$OSigma[j], Df_obvs$OAlpha[j]])
Df_obvs
#>   Names Row OAlpha OSigma Lambda Lambda1
#> 1   Bob   1   0.05    0.1      4       4
#> 2  Jane   2   0.75    0.9      0       0
#> 3   Sue   3    1.5    1.4      4       4

Создано в 2020-03-18 пакетом Представления (v0.3.0)

...