如何在rrapply::rrapply()的how="melt"模式下保留空列表条目
如何让rrapply包的rrapply()在how="melt"时保留空列表条目
当使用rrapply包的rrapply()函数并设置how="melt"时,默认会自动丢弃值为0长度列表的条目(比如示例中的B和E)。要保留这类条目,可以通过自定义处理逻辑实现。
注:最初在更简单的示例中,@akrun提供了初始解决方案,后续扩展到包含多层空列表的复杂场景后,基于该方案得到了最终解决方法。
示例代码
首先构造测试列表并查看其结构:
library(rrapply) lst <- list(A=1, B=list(), C=list(D=letters[1:3], E=list())) str(lst) #> List of 3 #> $ A: num 1 #> $ B: list() #> $ C:List of 2 #> ..$ D: chr [1:3] "a" "b" "c" #> ..$ E: list()
默认how="melt"会丢弃空列表条目:
rrapply(lst, how="melt") #> L1 L2 value #> 1 A <NA> 1 #> 2 C D a, b, c
解决方案
通过设置condition匹配空列表,并用f为其指定占位值,同时开启keep.null = TRUE确保空列表被处理:
rrapply(lst, condition = function(x) is.list(x) && length(x) == 0, f = function(x) NA, how = "melt", keep.null = TRUE)
执行后会得到包含B和E条目的结果:
L1 L2 value 1 A <NA> 1 2 B <NA> NA 3 C D a, b, c 4 C E NA
如果希望保留空列表的原始类型标记,可调整f的返回值为原空列表:
rrapply(lst, condition = function(x) is.list(x) && length(x) == 0, f = identity, how = "melt", keep.null = TRUE)
结果:
L1 L2 value 1 A <NA> 1 2 B <NA> list() 3 C D a,b,c 4 C E list()
内容的提问来源于stack exchange,提问作者mpettis
相关产品推荐
相关产品推荐

