如何将命名元素添加到 R 中的向量
How to add named elements to a vector in R
我有一个命名向量(比如 n),名称是从 1 到 25000 的连续整数,以及与之关联的值,还有另一个更小的向量(比如 m),类似于 "n",有 21399 个元素, 名称从 1 开始到 25000 结束。
我想将命名元素添加到向量 "m" 中以找到缺少的名称,并为它们分配值 0。
我通过创建两个数据框并将名称和值作为两列,然后进行左连接来做到这一点,但是有没有更好的方法来做到这一点?
一个更小的例子:
> n=c("1"=3,"2"=5,"3"=2,"4"=9,"5"=8)
> n
1 2 3 4 5
3 5 2 9 8
> m=c("1"=9,"2"=7,"5"=2)
> m
1 2 5
9 7 2
我希望我的最终 "m" 是:
> m
1 2 3 4 5
9 7 0 0 2
我所做的是:
> x=data.frame("p"=names(n),n)
> y=data.frame("p"=names(m),m)
> join(x,y,by="p")
p n m
1 1 3 9
2 2 5 7
3 3 2 0
4 4 9 0
5 5 8 2
几次尝试:
m[setdiff(names(n), names(m))] <- 0
m[order(as.numeric(names(m)))]
#1 2 3 4 5
#9 7 0 0 2
m <- c(m,replace(n,,0))
tapply(m, names(m), sum)
#1 2 3 4 5
#9 7 0 0 2
replace(replace(n,,0), match(names(m),names(n)), m)
#1 2 3 4 5
#9 7 0 0 2
使用 NA
s 而不是 0:
setNames( m[match(names(n),names(m))], names(n) )
# 1 2 3 4 5
# 9 7 NA NA 2
我们可以用这个
x=data.frame("p"=names(n),n)
y=data.frame("p"=names(m),m)
merged = merge (x , y, by ="p", all.x = TRUE)
并用零替换 "NA",我们有
merged[is.na(merged)] <- 0
输出
p n m
1 1 3 9
2 2 5 7
3 3 2 0
4 4 9 0
5 5 8 2
我有一个命名向量(比如 n),名称是从 1 到 25000 的连续整数,以及与之关联的值,还有另一个更小的向量(比如 m),类似于 "n",有 21399 个元素, 名称从 1 开始到 25000 结束。
我想将命名元素添加到向量 "m" 中以找到缺少的名称,并为它们分配值 0。
我通过创建两个数据框并将名称和值作为两列,然后进行左连接来做到这一点,但是有没有更好的方法来做到这一点?
一个更小的例子:
> n=c("1"=3,"2"=5,"3"=2,"4"=9,"5"=8)
> n
1 2 3 4 5
3 5 2 9 8
> m=c("1"=9,"2"=7,"5"=2)
> m
1 2 5
9 7 2
我希望我的最终 "m" 是:
> m
1 2 3 4 5
9 7 0 0 2
我所做的是:
> x=data.frame("p"=names(n),n)
> y=data.frame("p"=names(m),m)
> join(x,y,by="p")
p n m
1 1 3 9
2 2 5 7
3 3 2 0
4 4 9 0
5 5 8 2
几次尝试:
m[setdiff(names(n), names(m))] <- 0
m[order(as.numeric(names(m)))]
#1 2 3 4 5
#9 7 0 0 2
m <- c(m,replace(n,,0))
tapply(m, names(m), sum)
#1 2 3 4 5
#9 7 0 0 2
replace(replace(n,,0), match(names(m),names(n)), m)
#1 2 3 4 5
#9 7 0 0 2
使用 NA
s 而不是 0:
setNames( m[match(names(n),names(m))], names(n) )
# 1 2 3 4 5
# 9 7 NA NA 2
我们可以用这个
x=data.frame("p"=names(n),n)
y=data.frame("p"=names(m),m)
merged = merge (x , y, by ="p", all.x = TRUE)
并用零替换 "NA",我们有
merged[is.na(merged)] <- 0
输出
p n m
1 1 3 9
2 2 5 7
3 3 2 0
4 4 9 0
5 5 8 2