用R

时间:2016-04-02 00:16:13

标签: arrays r sorting

我有一个数组/命名向量,如下所示:

d  f  g
1  2  3

我想填补空位,这意味着我想要这个:

a  b  c  d  e  f  g
0  0  0  1  0  2  3

有没有一种优雅的方式来做这个,而不必编写循环和条件?在我的实际问题中,而不是abcd作为我的数组名称,它的数字。不确定这是否有所作为。对于可重现的示例,图形字母表更容易理解。

2 个答案:

答案 0 :(得分:0)

数据

x <- c(d=1L,f=2L,g=3L);
x;
## d f g
## 1 2 3

解决方案1:首先将新名称与x匹配并提取值,然后将N替换为零。

x <- setNames(x[match(letters[1:7],names(x))],letters[1:7]);
x[is.na(x)] <- 0L;
x;
## a b c d e f g
## 0 0 0 1 0 2 3

解决方案2:使用nomatch的{​​{1}}参数进行单线程。

match()

答案 1 :(得分:0)

创建最终名称nms的向量,然后使用sapply从中创建一个零的命名向量,并将输入名称对应的元素替换为输入值。

v <- c(d = 1, f = 2, g = 3) # input

nms <- letters[letters <= max(names(v))] # names on output vector, i.e. letters[1:7]
replace(sapply(nms, function(x) 0), names(v), v) ##

,并提供:

a b c d e f g 
0 0 0 1 0 2 3 

如果在实际的矢量中名称不是字母,那么只需自己设置nms。例如,nms <- c("dogs", "cats", "d", "elephants", "f", "g")可以使用上面标有##的相同行。

2)另一种方法是将标有##的行替换为:

unlist(modifyList(as.list(setNames(numeric(length(nms)), nms)), as.list(v)))