2012-01-17 4 views
1

많은 data.frames를 병합해야합니다. 오류를 재현하는 코드 샘플 아래. 그것은 마치 버그처럼 보입니다. data.frames를 병합하면 match.names 오류가 발생합니다.

이 코드

잘 작동 :

df1 <- data.frame(v=1:10, v2=rev(1:10)) 
df2 <- data.frame(vv=1:8, v2=rev(5:12)) 
df12 <- merge(x=df1, y=df2, by.x=1, by.y=1, all=TRUE, suffixes=c(".x", ".y")) 
df3 <- data.frame(w=2:6, v2=3:7) 
df123 <- merge(x=df12, y=df3, by.x=1, by.y=1, all=TRUE, suffixes=c(".x", ".y")) 
df4 <- data.frame(x=1:6, v2=1:6) 
df1234 <- merge(x=df123, y=df4, by.x=1, by.y=1, all=TRUE, suffixes=c(".x", ".y")) 

이 코드는 마지막 줄에 오류 메시지를 생성 오류를 match.names에 (clabs, 이름 (11 세)) : 이름은 이전 이름과 일치하지 않습니다. 유일한 변화는

df1 <- data.frame(v=1:10, v2=rev(1:10)) 
df2 <- data.frame(vv=1:8, v2=rev(5:12)) 
df12 <- merge(x=df1, y=df2, by.x=1, by.y=1, all=TRUE, suffixes=c(".x", ".y")) 
df3 <- data.frame(w=2:6, v2=3:7) 
df123 <- merge(x=df12, y=df3, by.x=1, by.y=1, all=TRUE, suffixes=c(".x", ".y")) 
df4 <- data.frame(x=1:16, v2=1:16) 
df1234 <- merge(x=df123, y=df4, by.x=1, by.y=1, all=TRUE, suffixes=c(".x", ".y")) 

이의이

names(df123) 
[1] "v" "v2.x" "v2.y" "v2" 

그런 다음 임의의 하나

names(df123)[4] <- "v3" 

에 마지막으로 이름을 변경 df123의 열 이름을 보자 그 nrow (DF4)> nrow (df123)입니다 이제이 코드는 올바르게 작동합니다.

df1234 <- merge(x=df123, y=df4, by.x=1, by.y=1, all=TRUE, suffixes=c(".x", ".y")) 

버그입니까? Win7에서 R 2.13.1을 사용했습니다. 다른 정보가 필요하면 질문에 추가하겠습니다.

+0

그래, 진짜 버그처럼 보입니다. 이것은 아마도 R listserv로 전송되어야합니다. 우리는 먼저 merge.data.frame의 해당 줄을 찾아야합니다. – nograpes

+1

R 2.14.1과 동일한 동작을 보입니다. 또한 오류가 'nrow (df4)'가 'nrow (df123)'보다 커진다는 것을 확인할 수 있습니다. 'df4 <- data.frame (x = 1 : 10, v2 = 1 : 10)'을 사용하면'df4

+0

설명해 주셔서 감사합니다. – DrDom

답변

4

이것은 확실히 버그이므로 Windows 7의 R 2.14.1에서 테스트했지만 운영 체제가 중요한 것은 아닌지 의심 스럽습니다.

이 오류는이 라인에서 "merge.data.frame"방법에서 발생
# Create data. 
df1=data.frame(rbind(c(1,10,12,NA))) 
df2=data.frame(rbind(c(11,11))) 

# Works fine. 
merge(df1,df2,by=1,all=T) 

# X1 X2.x X3 X4 X2.y 
# 1 1 10 12 NA NA 
# 2 11 NA NA NA 11 

# Change the names of the columns. 
names(df1)= c('v','v2.x','v2.y','v2') 
names(df2)= c('x','v2') 

# Same data fails! 
merge(df1,df2,by=1,all=T) 

# Error in match.names(clabs, names(xi)) : 
# names do not match previous names 

:

x <- rbind(x, ya) 

문제는 "이다 여기 버그의"작은 "테스트 케이스를 다시 x "와"ya "는 동일한 열 이름을 공유하지 않습니다.

ya <- cbind(ya, x[rep.int(NA_integer_, nyy), nm.x, drop = FALSE]) 

는 "nm.x"이름 C 세트 ("버전 2.x", "v2.y", "버전 2.x이 : 그 문제는 이전 전에 두 라인이 라인에서 발생 "). x는 이름이 'v2.x'인 두 개의 열이있는 data.frame입니다. 흥미롭게도이 data.frame에서 열을 선택하면 열 중 하나의 이름이 바뀌는 것처럼 보입니다!

names(x) 
[1] "v" "v2.x" "v2.y" "v2.x" 
nm.x 
[1] "v2.x" "v2.y" "v2.x" 
x[,nm.x] 
    v2.x v2.y v2.x.1 
1 10 12  10 

내가 대신 이름으로, 컬럼의 위치를 ​​사용하여이 문제를 해결하려고했으나 결과 이름은 여전히 ​​변경 (그러나 값이 당신이 원하는 것을 지금)!

x[,c(2,3,4)] 
    v v2.x v2.y v2.x.1 
1 1 10 12 NA 

나는 posted this as a bug입니다.

+0

버그 리포트를 해주셔서 감사합니다. 저는 R에서 상대적으로 초보자이므로 신속하게 조사 할 수 없었습니다.내 초기 문제를 해결하기 위해 예를 들어 각각의 병합 후 열 이름을 숫자로 바꾸고 마지막 data.frame에서 별도의 벡터에 저장된 올바른 이름으로 바꿉니다 (예, 중복 된 이름 필요). – DrDom

+0

여기에서 루프를 닫으려면 R NEWS 파일의 2012-01-24 항목에 "merge()가 중복 된 열 이름 (PR # 14786으로 혼동 됨)이있는 데이터 프레임을 만드는 것이 더 이상 허용되지 않습니다." PR # 14786은이 토론에서 파생 된 버그 보고서 인 https://bugs.r-project.org/bugzilla3/show_bug.cgi?id=14786을 참조합니다. –

관련 문제