我有一个数组/命名向量,如下所示:
d f g
1 2 3
我想填补空位,这意味着我想要这个:
a b c d e f g
0 0 0 1 0 2 3
有没有一种优雅的方式来做这个,而不必编写循环和条件?在我的实际问题中,而不是abcd作为我的数组名称,它的数字。不确定这是否有所作为。对于可重现的示例,图形字母表更容易理解。
答案 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)))