如果列表中的某些输入值为NULL,则 r语言 - lapply



我有一个不同大小的矩阵列表,看起来像这样:

> 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))}

最新更新