如何在保留R语言列表t_blocks原始结构的同时替换所有值为'ord'?
保留R语言列表原始结构替换所有元素为"ord"的解决方案
先来看你的问题:
我拥有一个长度为22的R语言列表
t_blocks,其结构如下:[[1]] [1] 3 4 5 [[2]] [1] 6 7 8 9 [[3]] [1] 10 11 12 [[4]] [1] 13 14 15 16 [[5]] [1] 17 18 19 20 21 [[6]] [1] 22 23 24 25 26 [[7]] [1] 27 28 29 30 31 32 33 [[8]] [1] 34 35 [[9]] [1] 36 37 38 39 40 41 [[10]] [1] 42 43 44 45 46 [[11]] [1] 47 48 49 50 [[12]] [1] 51 52 53 54 55 [[13]] [1] 56 57 [[14]] [1] 58 59 60 61 62 [[15]] [1] 63 64 65 66 67 68 69 [[16]] [1] 70 71 72 [[17]] [1] 73 74 75 76 77 [[18]] [1] 78 79 80 81 [[19]] [1] 82 83 84 [[20]] [1] 85 86 87 88 89 [[21]] [1] 90 91 92 93 94 [[22]] [1] 2我需要将列表中的所有值替换为"ord"。曾尝试使用unlist和relist方法:
t_scaling = unlist(t_blocks) relist(replace( t_scaling, t_scaling>="0", "ord"), skeleton=t_blocks)但结果得到的列表长度为93,未能保留原始结构。请问是否有其他方法可实现保留
t_blocks原始结构的替换操作?
其实不用拆列表再重组,直接对每个子元素处理就好,给你几个简单可靠的方法:
方法1:基础R的lapply()(最推荐)
这是最直接的原生方法,完全不需要额外包,还能100%保留原列表的结构:
t_blocks_ord <- lapply(t_blocks, function(x) rep("ord", length(x)))
逻辑很简单:遍历列表里的每一个子向量,生成一个和它长度一模一样的、全是"ord"的新向量,最后自动组合成和原列表结构完全一致的新列表。
方法2:用purrr包的map()(tidyverse风格)
如果你平时习惯用tidyverse工具链,purrr::map()的语法更简洁,效果和lapply完全一致:
library(purrr) t_blocks_ord <- map(t_blocks, ~rep("ord", length(.x)))
这里的~是公式简写,.x就代表列表里的每个子元素,用起来很顺手。
方法3:递归处理的rapply()(适合嵌套列表)
如果你的列表是多层嵌套的(当然你的例子是单层),rapply()可以递归替换元素,单层场景下也能正常使用:
t_blocks_ord <- rapply(t_blocks, function(x) "ord", how = "replace")
how = "replace"参数会让它直接替换原列表里的元素,不会改变原有结构。
为什么你的原方法出问题?
你用unlist()之后得到的是一个长度93的向量(所有子元素的总数),虽然relist()指定了骨架,但可能因为类型转换(数值转字符)或者relist的匹配逻辑细节问题,导致结构出错。而上面的方法都是直接对每个子元素操作,从根源上避免了拆分重组的风险,肯定不会出问题。
内容的提问来源于stack exchange,提问作者AToe
相关产品推荐
相关产品推荐

