문제

메모: 처음 게시했을 때의 예를 변경했습니다. 첫 번째 예는 실제 문제를 포착하기에는 너무 단순화되었습니다.

하나의 열에서 다르게 정렬되는 두 개의 데이터 프레임이 있습니다. 하나의 열을 일치시킨 다음 두 번째 열에서 값을 병합하고 싶습니다. 두 번째 열은 같은 순서로 유지되어야합니다.

그래서 나는 이것을 가지고있다 :

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))

테스트 및 작업.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top