【发布时间】:2017-06-20 07:01:28
【问题描述】:
我有一个包含命名元素的列表(将它们称为“子列表”以避免混淆)。并非所有子列表都包含所有命名元素。我希望将缺少元素的子列表增加为NA。
例子:
l <- list(list(a = 1, b = 2, c = 3),
list(a = 4, b = 5, c = 6),
list(a = 7, b = 8),
list(a = 9, c = 10))
可以看出,第 3 和第 4 个子列表分别缺少 c 和 b 元素。我希望将这些元素作为NA 扩充到这些子列表中,即:
res <- list(list(a = 1, b = 2, c = 3),
list(a = 4, b = 5, c = 6),
list(a = 7, b = 8, c = NA),
list(a = 9, b = NA, c = 10))
实际上,如果这样更容易,每个子列表只缺少最后一个 k 元素(即我没有像第 4 个子列表中缺少中间元素 b 的情况),但我觉得在此过程中,让我们找到一个通用的解决方案。
更新:
为这个特定场景提供了 3 个很好的解决方案,其中子列表元素是 ints。但是元素可以是chrs,甚至是列表!例如:
l <- list(list(a = list(1,2), b = 2, c = 3),
list(b = 5, c = 6),
list(a = list(5,6), b = 8),
list(a = list(7,8), c = 10))
a 元素是一个列表,应该在res 列表中保持这种状态。如果丢失,我想要一个NA,像往常一样:
res <- list(list(a = list(1,2), b = 2, c = 3),
list(a = NA, b = 5, c = 6),
list(a = list(5,6), b = 8, c = NA),
list(a = list(7,8), b = NA, c = 10))
【问题讨论】:
-
Welp,这变成了一个变色龙问题,所以我走了。顺便说一句,您还应该为您的新输入显示所需的输出。
-
用一个“字符”子化一个“列表”可以返回
NULL在不存在名称的情况下 - 即开始可能是nms = unique(unlist(lapply(l, names))); lapply(l, "[", nms)然后,恢复“名称”并替换NULLs