2015-02-02 3 views
2

가정하자 I는 다음 데이터 프레임을 가지고 I 원하는 다른 데이터 프레임에 기초하여 복수의 컬럼의 레코드를 바꾸기

df <- data.frame(x = c(1,1,1,3,3,3,4,4,4), 
       y = c(1,3,4,1,3,4,1,3,4), 
       z = c(6,3,7,8,2,3,0,1,2)) 

는 열 (X)의 값을 바꾸고하기를 Y 다른 데이터 프레임에 포함 된 매핑에 기초 :

df.aux <- data.frame(id = c(0,1,2,3,4), 
        desc = c('zero', 'one', 'two', 'three', 'four)) 

을 구하는 방법

 x  y z 
1 one one 6 
2 one three 3 
3 one four 7 
4 three one 8 
5 three three 2 
6 three four 3 
7 four one 0 
8 four three 1 
9 four four 2 

주, df.aux에 매핑이 더 르 포함 할 수 있음 df에서보다 vels. df $ x를 df $ id로 변경하고 두 개의 df를 병합 한 다음 df $ y에 대해 반복하여 매핑을 수행 할 수 있습니다. 그러나 그것은 매우 어색하고, 그래서 더 좋은 방법이 있어야합니다.

답변

3

당신은 매핑 할 경기를 기능을 사용할 수 있습니다 :

df.new <- data.frame(x=df.aux$desc[match(df$x, df.aux$id)], y=df.aux$desc[match(df$y, df.aux$id)], z=df$z) 
+0

놀라운와 먼저 서브 세트 수 있습니다. 많은 감사합니다! – mattek

+1

또는 값을 교환해야하는 열이 많으면 다음과 같이 할 수 있습니다. 'solution <- (df, c (1,2), function (x) df.aux [ df.aux $ id == x, 2])' –

1

factor 기능 매핑 및 라벨의 직접 할당을 허용 할 수 있습니다. df.aux이 빠르게 작업하기에 너무 큰 경우

> df$x <- factor(df$x, levels = df.aux$id, labels = df.aux$desc) 
> df$y <- factor(df$y, levels = df.aux$id, labels = df.aux$desc) 
> df 
     x  y z 
1 one one 6 
2 one three 3 
3 one four 7 
4 three one 8 
5 three three 2 
6 three four 3 
7 four one 0 
8 four three 1 
9 four four 2 

 

> df <- data.frame(x = c(1,1,1,3,3,3,4,4,4), 
+     y = c(1,3,4,1,3,4,1,3,4), 
+     z = c(6,3,7,8,2,3,0,1,2)) 

> df.aux <- data.frame(id = c(0,1,2,3,4), desc = c('zero', 'one', 'two', 'three', 'four')) 
, 당신은 내가 필요 정확히,

df.aux[df.aux$id %in% union(df$x, df$y),] 
+0

흥미 롭습니다. @Enrique의 답변이 처음 이었기 때문에 받아 들였지만 이것은 완벽하게 작동합니다. – mattek

관련 문제