2013-10-03 7 views
1

나는 간단한 R 질문이 있습니다. 두 개의 데이터 프레임이 있습니다. 첫 번째 것은 가능한 모든 해를 포함합니다. NA에 두 번째 열을 지정합니다. 두 번째 데이터 프레임에는 가능한 연도의 하위 집합 만 있지만 두 번째 열의 실제 값은 있습니다. 두 데이터 프레임을 결합하고 싶습니다. 좀 더 구체적으로 말하자면, 나는 일년에 한 해를 맞추기를 원하고, 두 번째 해가 정확한 해가되면 첫 번째 NA를 두 번째 해의 값으로 바꿉니다.data.frame matching

다음은 예제 코드입니다.

one <- as.data.frame(matrix(1880:1890, ncol=2, nrow=11)) 
one[,2] <- NA 
two <- data.frame(ncol=2, nrow=3) 
two[1,] <- c(1880, "a") 
two[2,] <- c(1887, "b") 
two[3,] <- c(1889, "c") 

난 C "최초 행의 값을 가지고"는 "여덟 번째 행, 두 번째 열이되도록 하나의 두 번째 열"B "및 열 번째 행에, 두 번째 열을 얻고 싶은. "

위의 코드를 더 편하게 만들어보세요. merge은 (

one[,1]==two[,1] -> test 

그러나 테스트는 값 1880과 1887 ...

+2

을 확인, C '의 두 요소 (1880, "A")'벡터는 하나 개의 클래스를 가질 수 있기 때문에 문자입니다. 아래에서 볼 수 있듯이 병합은 작동하지만 어쩌면 올해 변수에 대해 일관된 클래스를 유지하려고 할 수 있습니다. 또한 data.frame을 만들기위한 올바른 구문이 아닙니다 (ncol, nrow는 사용하지 않습니다). – Frank

답변

3
one[match(two[,1],one[,1]),2]<-two[,2] 

당신이 찾고있는 무엇을 제공해야한다 :

> one 
    V1 V2 
1 1880 a 
2 1881 <NA> 
3 1882 <NA> 
4 1883 <NA> 
5 1884 <NA> 
6 1885 <NA> 
7 1886 <NA> 
8 1887 b 
9 1888 <NA> 
10 1889 c 
11 1890 <NA> 
1

여기 한 가지 방법이 포함되어 있습니다

한 가지는 내가 예비 단계로했지만, 그것은 조금 이상한 결과가 있었다 준 또 다른) :

library(qdap) 
one[, 2] <- lookup(one[, 1], two) 
one 

##  V1 V2 
## 1 1880 a 
## 2 1881 <NA> 
## 3 1882 <NA> 
## 4 1883 <NA> 
## 5 1884 <NA> 
## 6 1885 <NA> 
## 7 1886 <NA> 
## 8 1887 b 
## 9 1888 <NA> 
## 10 1889 c 
## 11 1890 <NA> 
2

이러한 유형의 문제에는 병합을 사용하고 싶습니다. 제 생각에는 꽤 간단합니다. 참고 도움말 기사 ?merge

three <- merge(one, two, by.x = 'V1', by.y = 'ncol', all = T)