通过排除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