2012-06-13 4 views
0

하나의 열 (X)과 두 개의 열 (Y &)이있는 두 개의 데이터 프레임이 있습니다. Z) : 1, 2, 3, A, 5, B, 7, 8, C, D, 11, 12 etc.X 열의 값을 Y 열의 값으로 바꾸기 X 열의 값이 Z 열의 값과 일치하는 경우에만

열 Y 특정에) 열 Z에 나타나는대로 (페어링이 같은 문자를 포함

열 X 가끔 번호를 1:99이 있지만 숫자 대신 몇 가지 문자, 즉있다 숫자 : 예 :

A 4

B 6

C 9

D 10

가 어떻게에 따라, 열 Z의 값으로 열 X에서 문자를 대체 할 수있는 열 Y의 문자 열 X 매치에서 문자 여부? 이 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 etc.

는 직접적인 merge는 (나는 X의 모든 값을 유지해야합니다) 그리고 내가 조건부 sub을 사용하는 방법을 모르겠어요 작동하지 않습니다되는 열 X 초래할 것이다. 또한 Y 및 Z 열에는 X 열보다 많은 행이 포함되어 있으므로 cbind을 사용할 수 없습니다. 나는 아마도 최선의 방법이기는하지만, 아마도 regex을 사용하는 데 익숙하지는 않습니다 ...

어떤 도움을 주시면 감사하겠습니다!

답변

2

for 루프를 사용하고 싶습니다. 우리는 그 다음 우리가 대체 할 수 있는지 일들이 테스트 평등

df1$X <- as.character(df1$X) 
df2$Y <- as.character(df2$Y) 

를 들어, 문자 벡터,하지 요인해야

df1 <- data.frame(X = c("A", 5, "B", 7, 8, "C", "D", 11, 12)) 
df2 <- data.frame(Y = c("A", "B", "C", "D"), 
        Z = c(4, 6, 9, 10)) 

: 데이터 만들기 마지막으로

for (i in 1:nrow(df2)) { 
    df1$X[df1$X == df2$Y[i]] <- as.character(df2$Z[i]) 
} 

을, 나는 모든 문자가 없어지므로 숫자가 X이 되길 원합니다.

df1$X <- as.numeric(df1$X) 
+3

다음과 같이 for 루프 대신'match'를 사용할 수도 있습니다 :'tmp <- df2 $ Z [match (df1 $ X, df2 $ Y)]; df1 $ X <- ifelse (is.na (tmp), df1 $ X, tmp)' – Aaron

+0

'for' 루프가 작동하는 것처럼 보이지만 30.000 행으로 매우 오래 걸립니다. 'grep '을 사용하여 교체해야하는 열 X의 행을 추출했지만 행 번호의 목록을'for' 루프에 통합하여 그 행에 대해서만 반복 할 수 있습니까? 편집 :'match' 신속하고 완벽하게 작동합니다! (즉,'df1 $ X'의 두 번째 언급을'as.character()'에 넣었 으면) – user1092247

+0

데이터 프레임에서 열을 가져 와서 for 루프를 사용하면 for 루프가 훨씬 빨라집니다 벡터. – Gregor

1

어때 대략 X[X==Y] <- Z[X==Y]? 또는 당신의 Y, Z의 dataframe DF를 호출

X[X==DF$Y] <- DF$Z[X==DF$Y]

편집 :이 본질적으로 Shuja의 대답과 동일하지만, 지금까지 내가 볼 수있는 루프에 대한 필요가 없습니다.

+0

길이가 다르기 때문에 작동하지 않을까요?"또한 Y와 Z 열은 X 열보다 많은 행을 포함합니다." – Gregor

+0

X 인덱스의 최대 인덱스에서 멈출 것입니다. 기계 승/R 거주자 :-( –

+0

또는 최악의 경우'xmax <-length (X); X [X == DF $ Y [1 : xmax] ...]에 도착할 때까지 테스트 할 수 없습니다. 불일치 한 길이 문제를 해결합니다. –

관련 문제