문제
메모: 처음 게시했을 때의 예를 변경했습니다. 첫 번째 예는 실제 문제를 포착하기에는 너무 단순화되었습니다.
하나의 열에서 다르게 정렬되는 두 개의 데이터 프레임이 있습니다. 하나의 열을 일치시킨 다음 두 번째 열에서 값을 병합하고 싶습니다. 두 번째 열은 같은 순서로 유지되어야합니다.
그래서 나는 이것을 가지고있다 :
state<-c("IA","IA","IA","IL","IL","IL")
value1<-c(1,2,3,4,5,6)
s1<-data.frame(state,value1)
state<-c("IL","IL","IL","IA","IA","IA")
value2<-c(3,4,5,6,7,8)
s2<-data.frame(state,value2)
s1
s2
이를 반환합니다.
> s1
state value1
1 IA 1
2 IA 2
3 IA 3
4 IL 4
5 IL 5
6 IL 6
> s2
state value2
1 IL 3
2 IL 4
3 IL 5
4 IA 6
5 IA 7
6 IA 8
그리고 나는 이것을 원한다 :
state value1 value2
1 IA 1 6
2 IA 2 7
3 IA 3 8
4 IL 4 3
5 IL 5 4
6 IL 6 5
나는 이것을 해결하려고 노력하는 바보 같은 나 자신을 운전하려고한다. 간단한 첨자 문제인 것 같습니다.
해결책
이 작업을 수행하는 방법에는 여러 가지가 있지만 (결국 R,) 가장 분명한 것은 인덱스를 만드는 것이라고 생각합니다. 순차적 인덱스를 생성하는 함수가 필요합니다 (1에서 시작하여 관찰 수로 끝나는).
seq_len(3)
> [1] 1 2 3
그러나 각 그룹화 변수 (상태) 내 에서이 인덱스를 계산해야합니다. 이를 위해 R을 사용할 수 있습니다 ave
기능. 첫 번째 인수, 그 다음 그룹화 요소, 그리고 마지막으로 각 그룹에 적용되는 함수로 숫자가 필요합니다.
s1$index <- with(s1,ave(value1,state,FUN=seq_len))
s2$index <- with(s2,ave(value2,state,FUN=seq_len))
(사용에 유의하십시오 with
, R은 환경/데이터 프레임 내의 변수를 검색하도록 지시합니다. 이것은 s1 $ value1, s2 $ value2 등을 사용하는 것보다 더 나은 실습입니다).
이제 두 개의 데이터 프레임 (상태 및 색인에 존재하는 변수)을 간단히 (조인) 병합 할 수 있습니다.
merge(s1,s2)
주는 것
state index value1 value2
1 IA 1 1 6
2 IA 2 2 7
3 IA 3 3 8
4 IL 1 4 3
5 IL 2 5 4
6 IL 3 6 5
이를 위해서는 각 데이터 프레임에서 상태별로 동일한 수의 관찰이 있어야합니다.
편집 : 명확성을위한 코드에 주석을 달았습니다.] [편집 : Hadley가 제안한 새로운 기능을 작성하는 대신 SEQ_LEN을 사용했습니다.
다른 팁
참고 : 위의 답변에 대한 다섯 번째 의견을 확인하십시오. 해결책이 있어야합니다
s1$index <- with(s1,ave(value1,state,FUN=seq_along))
s2$index <- with(s2,ave(value2,state,FUN=seq_along))
테스트 및 작업.