【问题标题】:lapply if some input values in a list are NULL如果列表中的某些输入值为 NULL,则 lapply
【发布时间】: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 成功了!谢谢!!我将不得不把它放回矩阵列表的形状,但除此之外他做到了:))非常感谢!

标签: r list matrix lapply


【解决方案1】:

创建一个匿名函数来检查它是否通过NULL。您可能还想使用[<- 而不是= 来分配到矩阵并保留其类和维度。两者一起:

MDP$b[] <- lapply(MDP$b, \(x) if (!is.null(x)) col_norm(x) else NULL)

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • OP 没有 NA 值。他们有NULL
    • @Roland 编辑我的
    • 是的,它还没有解决问题 :// 一点背景:上面的列表是一些使用单元结构的 Matlab 代码的转换。我使用列表来做的很好。只是 B 矩阵,我把它们放在上面的列表中,只留下部分维度为空......也许还有另一种方法来列出上面的矩阵......
    • @SteffenSchwerdtfeger 为什么不呢?试试col_norm = function(x){t(t(x)/colSums(replace(x, 'NULL', NA), na.rm=TRUE))}
    • 它说“colSums 中的错误(替换(x,NULL,NA),na.rm = TRUE):'x' 必须是数字”。如果我处理 MDP$B[[1,1]],则可以与其他列表一起正常工作,但不幸的是仍然不能与 MDP$B 一起使用。
    猜你喜欢
    • 1970-01-01
    • 2016-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    • 2023-01-28
    相关资源
    最近更新 更多