我想将df与矩阵相乘。 df具有0值,矩阵具有NA值(这很重要)。通过将0(以df为单位)与值(在垫子中)相乘得到0并且通过将值(在df中)与NA(在垫子中)相乘,我得到NA,这对我来说是真实的并且完全没问题。但是,当我将0(df)与NA(mat)相乘时,我得到NA,这可能是真的。但有没有办法获得0?因为我对那些0感兴趣。这里有一些示例数据:
if($('#fullpage').length){
$('#fullpage').fullpage();
}
我的预期结果(e中为0):
df0 <- data.frame(a=1, b=0, c=2, d=5, e=0)
mat0 <- matrix(c(NA,2,NA,4,NA),nrow=1, ncol=5)
df_mat0 <- df0 * mat0
想法?感谢
答案 0 :(得分:1)
一种方法是将mat0
中的那些NA替换为df0
中乘以0的0。我不确定这个解决方案有多普遍(即它能与您的实际数据集一起使用吗?):
mat0[df0 == 0][is.na(mat0[df0 == 0])] <- 0
df0 * mat0
结果:
a b c d e
1 NA 0 NA 20 0
答案 1 :(得分:1)
作为替代方案:
似乎ifelse
就足够了:
unlist(ifelse(df0 == 0L, 0, mat0 * df0))
[1] NA 0 NA 20 0
在这种情况下,它会处理0
个案例。
答案 2 :(得分:1)
我不直接用mat0
覆盖0
中的值,而是创建一个临时对象,或者更简单地使用以下代码行
df0*`[<-`(mat0,df0==0,0)
# a b c d e
#1 NA 0 NA 20 0
功能
`[<-`(a,b,c)
返回a[b]=c
但实际上不会更改a
本身。
编辑:根据OP的请求(请参阅下面的评论),这里有更多代码。
我认为A[[y]]
和x
分别对应df0
和mat0
。如果是这样,请尝试
Map(function(x,y) A[[y]]*`[<-`(x,A[[y]]==0,0),B,sub('\\..*','',names(B)))