【发布时间】:2021-12-03 13:21:17
【问题描述】:
我有一个包含不同大小矩阵的列表,如下所示:
> 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) = 矩阵(c(2,4))
@Roland 的解决方案:使用: MDP$b[]
【问题讨论】:
-
有时是
B,有时是b?您始终可以使用匿名函数function(x) if (!is.null(x)) col_norm(x) else NULL。 -
如何实现这样的匿名函数?
-
我的代码显示了如何实现这个?只需在您的
lapply调用中将col_norm替换为此代码即可。 -
关于 B 和 b:上面说:如果列表中有一个“b”,那么 col_norm 就在它上面。如果没有给出,它将从 MDP$B 中创建一个 MDP$b。 MDP$B 在脚本的另一行中被规范化,但使用相同的 col_norm 函数。这是我正在做的一些 matlab 代码的转换...
-
@Roland 成功了!谢谢!!我将不得不把它放回矩阵列表的形状,但除此之外他做到了:))非常感谢!