通过排除R中的NA进行预乘
以下是示例数据:通过排除R中的NA进行预乘,r,R,以下是示例数据: set.seed(123) covar1 <- matrix(sample(c(NA, 1:3), 10, replace = TRUE), 10,1) covar2 <- matrix(sample(c(NA, 1:3), 10, replace = TRUE), 10,1) covar3 <- matrix(sample(c(NA, 1:3), 10, replace = TRUE), 10,1) covar4 <- matrix(sample(c(
set.seed(123)
covar1 <- matrix(sample(c(NA, 1:3), 10, replace = TRUE), 10,1)
covar2 <- matrix(sample(c(NA, 1:3), 10, replace = TRUE), 10,1)
covar3 <- matrix(sample(c(NA, 1:3), 10, replace = TRUE), 10,1)
covar4 <- matrix(sample(c(NA, 1:3), 10, replace = TRUE), 10,1)
covar5 <- matrix(sample(c(NA, 1:3), 10, replace = TRUE), 10,1)
df <- as.data.frame(cbind(covar1,covar2,covar3,covar4,covar5))
names(df) <- c("covar1","covar2","covar3","covar4","covar5")
现在,我想从df
中选择model0-2和对应行的预乘。不符合匹配条件的df行将给出NA
目的是始终使用3个可用模型中最长的模型。因此,如果该行与4协变量模型=model2匹配,则该df
行应与model2预乘。如果不匹配,则应尝试model1或model0
期望输出:
covar1 covar2 covar3 covar4 covar5 Output Model
1 NA 2 3 NA NA NA
2 1 NA 2 2 2 18 m1 # (1*2)+(2*5)+(2*3)=18
3 3 1 2 1 1 21 m2 # (1*3)+(1*5)+(3*2)+(7*1)=21
4 NA 1 NA 3 2 NA # (1*2)+(2*5)+(2*3)=18
..
..
现在,我不打算写我尝试过的东西,因为这会包含更多的信息,这通常是用户不喜欢的。对于这样的东西,甚至可能会有包装。非常感谢您的任何提示或帮助 首先,在制作data.frame时,不要将此
用作.data.frame
/cbind
组合。只用
df <- data.frame(covar1,covar2,covar3,covar4,covar5)
现在,我们可以通过数据框查看哪个模型与未缺失的协变量值重叠最多。首先我计算重叠,然后为每行选择最佳模型
mmatch <- sapply(models, function(m) rowSums(!is.na(df[,names(m)]))/ncol(m))
wmodel <- apply(mmatch,1,which.max)
我不确定您显示的期望输出是否实际使用了您指定的种子,因为我得到了不同的值
models <- list(m2=model2, m1=model1, m0=model0)
mmatch <- sapply(models, function(m) rowSums(!is.na(df[,names(m)]))/ncol(m))
wmodel <- apply(mmatch,1,which.max)
out<-unsplit(Map(function(m,d,n)
{cbind(d, Output=rowSums(d[,names(m)]*m[1,,drop=T], na.rm=T),
Model=n, stringsAsFactors=F)
},
models,
split(df, wmodel),
names(models)),
wmodel)
covar1 covar2 covar3 covar4 covar5 Output Model
1 1 3 3 3 NA 26 m1
2 3 1 2 3 1 24 m2
3 1 2 2 2 1 25 m2
4 3 2 3 3 1 32 m2
5 3 NA 2 NA NA NA m1
6 NA 3 2 1 NA NA m1
7 2 NA 2 3 NA 23 m1
8 3 NA 2 NA 1 19 m0
9 2 1 1 1 1 19 m2
10 1 3 NA NA 3 25 m0