2016-09-12 4 views
0

나는 이름이 1에서 25000까지 연속 된 정수로 이름이 지정된 벡터 (예 : n)와 그 값과 연관된 값을 가지고 있고 더 작은 벡터 (예 : m)는 " n "으로 21399 개의 요소가 있고 이름은 1에서 시작하여 25000으로 끝납니다.명명 된 요소를 벡터에 추가하는 방법 R

누락 된 이름의 벡터"m "에 명명 된 요소를 추가하고이 값을 0으로 지정하려고합니다.

이름과 값이 둘 다있는 두 개의 데이터 프레임을 만들고 양쪽 모두에 대해 두 개의 열을 만든 다음 왼쪽 조인을 수행했지만 더 나은 방법이 있습니까?

훨씬 작은 예 : 내가 무슨 짓을

> m 
1 2 3 4 5 
9 7 0 0 2 

했다 :

> 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"이되고 싶은

> 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 
+0

사람들이 쉽게 당신을 도울 수 있도록 [reproducible] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) 예제를 추가하십시오. –

+0

'n'과'm'은 어떻게 연관되어 있습니까? 기본적으로 값이 0 인 누락 된 이름 시퀀스가 ​​모두 필요합니다. –

+0

"n"과 "m"은 같은 범위의 이름을가집니다 –

답변

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 

0의 대신 S :

setNames(m[match(names(n),names(m))], names(n)) 
# 1 2 3 4 5 
# 9 7 NA NA 2 
+0

5 초 만에 나를 때리면 ... :-) – r2evans

0

우리는 0으로이

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