首页 > 解决方案 > 根据三个观测值的交集将观测值输入向量的程序

问题描述

您好,我很难找到我一直在编写的程序的解决方案,并且可以使用一些支持。

目标是为我的数据集中的每个人创建一个名为 Lambda 的新参数。Lambda 是 Df_obvs 中的 3 个观测值的函数:Row、OAlpha、OSigma。

Row 确定用于查找 Lambda 的 data.frame,而 OSigma 和 OAlpha 观察确定标识个体 Lambda 参数的行和列。有 3 个可能的“行”选项: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)

创建用于识别 Lambda 参数的数据框。

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

这就是我的挑战所在。我想让程序检查个人对 Row 的观察,以确定使用哪个数据框(Row1、Row 2 或 Row 3)来确定 Lambda。然后使用观测值 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]]})}}

感谢您的宝贵时间,并期待看到我哪里出错了。如果我应该澄清任何事情,请告诉我。

标签: rfor-loopif-statementsapply

解决方案


如果我说对了,下面的代码应该可以实现您想要实现的目标。基本思路:

  1. 将您的 Row-dfs 放入列表中(如果您有一堆类似的 dfs,列表总是很棒)
  2. 将 OAlpha 和 OSigma 转换为字符,以便通过 rowname 和 colname 索引 Row-dfs
  3. 获取每个人的 lambda 值(我只需将其作为另一个 var 放入 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

reprex 包(v0.3.0)于 2020-03-18 创建


推荐阅读