r - 根据三个观测值的交集将观测值输入向量的程序
问题描述
您好,我很难找到我一直在编写的程序的解决方案,并且可以使用一些支持。
目标是为我的数据集中的每个人创建一个名为 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]]})}}
感谢您的宝贵时间,并期待看到我哪里出错了。如果我应该澄清任何事情,请告诉我。
解决方案
如果我说对了,下面的代码应该可以实现您想要实现的目标。基本思路:
- 将您的 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 创建
推荐阅读
- java - 带有 RecyclerView 和 CardView 错误的片段:IllegalArgumentException:找不到片段 id 的视图
- mysql - 具有 1 组选择不同的 Mysql 查询
- sql - 根据其他两个表更新列
- mongodb - 如何从具有多个唯一字段的猫鼬驱动程序中识别或获取唯一字段名称
- pointers - 如何创建一个可以在单个单词大小内保存整数或指针的 Rust 类型?
- android - 如何在 adobe air 中显示计费权限?
- python - 了解 mfcc 的输出
- javascript - 如何使用 Angular 模板将 Id 反对的对象从服务器加载到我的表单中
- java - Java 10 中的非法反射访问操作警告
- c# - 为什么每个应用程序运行 5 秒钟没有响应,并且停止按钮无法单击?