通过在R中排除NA来预乘

时间:2014-07-04 15:19:44

标签: 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(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")

这些是我的3个模型,其参数各自与协变量相对应,如df

model0 <- data.frame(covar1=4,covar5=7)
model1 <- data.frame(covar1=2,covar3=5,covar4=3)
model2 <- data.frame(covar1=2,covar2=5,covar3=3,covar5=7)

现在,我想选择model0-2和预乘与df的相应行。不符合匹配条件的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
 ..
 .. 

现在,我不打算写下我尝试的内容,因为这会包含更多信息,这些信息通常都是SO用户不喜欢的。对于像这样的东西,甚至可能有包装。非常感谢任何提示或帮助。

1 个答案:

答案 0 :(得分:2)

首先,在制作data.frame时,请勿使用此as.data.frame / cbind组合。只需使用

df <- data.frame(covar1,covar2,covar3,covar4,covar5)

这也将适当地设置名称。我不确定人们选择cbind方法的地方,但这不是一个好习惯。

无论如何,要解决你的实际问题。最好将模型存储在列表中(最长到最短)。这将使处理更容易

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)

现在我知道每个组的最佳模型(好吧,特别是它在模型列表中的索引)我将基于最佳匹配拆分data.frame,进行乘法,然后重新加入数据

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

我不确定您显示的所需输出是否实际使用了您指定的种子,因为我有不同的值。