我有一个不同大小的矩阵列表,看起来像这样:
> MDP$B
[,1] [,2] [,3] [,4]
[1,] numeric,4 NULL NULL NULL
[2,] numeric,16 numeric,16 numeric,16 numeric,16
下面的工作与以前的列表,也工作,如果我只把它应用到上面的列表中,例如[[1,1]],所以NULL值是问题。
if(isfield(MDP,"b")){
MDP$b = lapply(MDP$b,col_norm)
} else{
MDP$b = lapply(MDP$B,col_norm)
}
函数col_norm看起来像这样,并标准化列向量:
col_norm = function(x){t(t(x)/colSums(x))}
我得到错误x必须是数字。是否有一种方法使lapply只是跳过NULL值?或者是否可以完全删除[1,2],[1,3]和[1,4],这样问题就不会发生了?
注意:应该写isfield(MDP, "b")而不是"b1",抱歉造成混淆。
解决方案@Roland:你总是可以使用匿名函数function(x) if (!is.null(x)) col_norm(x) else NULL。- - - - - -罗兰
最后一行是这样的:
MDP$B = lapply(MDP$B,function(x) if (!is.null(x)) col_norm(x) else NULL)
我必须重新定义列表"dim(MDP$B) = matrix(c(2,4))",但这很好:)
dim(MDP$B) = matrix(c(2,4))
解决方案也由@Roland:使用:MDP $ b [] & lt; -拉普(MDP $ b (x)如果(! is.null (x)) col_norm (x)其他NULL)
创建一个匿名函数,检查是否通过了NULL
。您也可能想使用[<-
而不是=
来分配到矩阵中并保留其类和维数。两个在一起:
MDP$b[] <- lapply(MDP$b, (x) if (!is.null(x)) col_norm(x) else NULL)
在colSums
函数中有一个na.rm
参数:
col_norm = function(x){t(t(x)/colSums(x, na.rm=TRUE))}
或者如果它们是NULL
,也做:
col_norm = function(x){t(t(x)/colSums(replace(x, NULL, NA), na.rm=TRUE))}