你好,我很难找到我正在编写的程序的解决方案,可能需要一些支持。
目标是为我的数据集中的每个人创建一个名为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、Row2或Row3(来确定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]]})}}
我很感激你抽出时间,并期待看到我哪里出了问题。如果我需要澄清什么,请告诉我。
如果我说得对,下面的代码应该可以实现您想要实现的目标。基本思路:
- 把你的Row dfs放在一个列表中(如果你有一堆类似的dfs,列表总是很棒的(
- 将OAlpha和OSigma转换为字符,用于按rowname和colname对Row-dfs进行索引
- 获取每个个体的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创建