有效填充矩阵

时间:2016-11-06 08:48:57

标签: r matrix dataframe dplyr reshape2

我有数据显示在一组医院中测量一组受试者的一组药物的治疗结果。 (#drugs> #subjects> #hospitals)

subjects <- paste("S",1:100,sep="_")
drugs <- paste("D",1:1000,sep="_")

我的data.frame每行都有drugsubjecthospitaloutcome组合:

df <- expand.grid(subject=subjects,drug=drugs,stringsAsFactors=F)
hospitals <- paste("H",1:10,sep="_")
df$hospital <- rep(sapply(hospitals,function(h) rep(h,10)),200)
set.seed(1)
df$outcome <- runif(nrow(df),0,100)

现在我想构建一个matrix,其中每一行都是唯一的hospital subject组合,每列都是唯一的hospital drug组合。这可能是构建此矩阵的最佳效率方法:

df$hospital.subject <- paste(df$hospital,df$subject,sep=":")
df$hospital.drug <- paste(df$hospital,df$drug,sep=":")

hospital.subject <- unique(paste(df$hospital,df$subject,sep=":"))
hospital.drug <- unique(paste(df$hospital,df$drug,sep=":"))

mat <- do.call(rbind,lapply(hospital.subject, function(x){
  hospital.subject.df <- dplyr::filter(df,hospital.subject==x)
  res <- rep(NA,length(hospital.drug))
  match.idx <- match(hospital.drug,hospital.subject.df$hospital.drug)
  res[which(!is.na(match.idx))] <- hospital.subject.df$outcome[match.idx[which(!is.na(match.idx))]]
  return(res)
}))
rownames(mat) <- hospital.subject
colnames(mat) <- hospital.drug

问题#1是如何在可能的情况下更有效地构建这个矩阵。

现在,由于矩阵稀疏,我希望将每个hospital.subject组合与其hospital.drug组合中的缺失值相混淆,即,未观察到这些subjects根据观察到它们的hospital.drug组合,从mean = mediansd = mad这些观察到的{{1}的正态分布组合。

换句话说,例如hospital.subject仅在subjects[1:10]中观察到hospitals[1],为每个hospitals[2:10]的{​​{1}}填写hospitals[1]。这意味着:

drug

mat[1:10,2:10] <- rnorm(90,median(mat[1:10,1]),mad(mat[1:10,1]))

等等和下一家医院(垫子中的行),例如,

mat[1:10,12:20] <- rnorm(90,median(mat[1:10,1]),mad(mat[1:10,1]))

mat[31:40,2:10] <- rnorm(90,median(mat[31:40,1]),mad(mat[31:40,1]))

使用mat[31:40,12:20] <- rnorm(90,median(mat[31:40,1]),mad(mat[31:40,1]))循环我会这样做:

for

有没有更有效和更优雅的方法来实现这一目标?

还有一件事,我的真实数据组织不如在这个例子中,因为每个医院的受试者数量不相同,此外还有一个以上医院用相同药物治疗的受试者。

1 个答案:

答案 0 :(得分:2)

这是你想要的吗?

main