如何将命名向量转换为命名列表,同时将具有相同名称的条目分组到一个列表元素中?

时间:2017-03-16 05:28:28

标签: r list vector data-structures

如何从tmp_l生成tmp_v,如下所示:

tmp_v <- c(a = 1, a = 2, a = 3, b = 2, c = 0, c = 4, a = 4)
tmp_l  <- list(a = c(1, 2, 3, 4), b = 2, c = c(0, 4))

as.list实现了此转换的一半,除了每个向量元素是一个单独的列表元素。我希望将具有相同名称的所有元素组合到一个列表元素中:

> as.list(tmp_v)
$a
[1] 1

$a
[1] 2

$a
[1] 3

$b
[1] 2

$c
[1] 0

$c
[1] 4

$a
[1] 4

有趣的是unlist(tmp_l)几乎提供了相反的行动:

> unlist(tmp_l)
a1 a2 a3 a4  b c1 c2 
 1  2  3  4  2  0  4 

上下文:像optim这样的优化例程需要将参数列表组合成一个参数向量。包执行此转换,并将列表中参数的名称添加到参数向量中。找到最佳参数向量后,有时需要将其转换回原始列表结构。

3 个答案:

答案 0 :(得分:1)

我们可以split vector names vectortmp_n <- split(unname(tmp_v), names(tmp_v)) identical(tmp_n, tmp_l) #[1] TRUE 执行此操作

=FormatDateTime(Now(), DateFormat.ShortDate)

答案 1 :(得分:1)

另一种选择是"select a.macid,a.expity_date from table1 a JOIN table2 b ON (a.macid like b.desktop OR a.macid like b.server)" stack向量:

unstack

答案 2 :(得分:1)

sapply的另一个选项是为每个unique名称查找向量的子集。

sapply(unique(names(tmp_v)), function(x) unname(tmp_v[names(tmp_v) == x]))

#$a
#[1] 1 2 3 4
#
#$b
#[1] 2
#
#$c
#[1] 0 4