Слияние data.frames вызывает ошибку match.names - PullRequest
1 голос
/ 17 января 2012

Мне нужно объединить много data.frames.Ниже приведен пример кода для воспроизведения ошибки.Это похоже на ошибку.

Этот код хорошо работает:

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, names (xi)): имена не соответствуют предыдущим именам.Единственное изменение состоит в том, что nrow (df4)> nrow (df123)

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

Давайте посмотрим имена столбцов df123

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

Затем изменим фамилию на произвольную

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

И теперь эта строка кода будет работать правильно

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

Это ошибка?Я использовал R 2.13.1 на Win7.Если вам понадобится какая-то другая информация, я добавлю ее к вопросу.

1 Ответ

4 голосов
/ 17 января 2012

Это определенно ошибка, я тестировал ее в R 2.14.1 на Windows 7, но сомневаюсь, что операционная система имеет значение. Я воссоздал «меньший» тестовый пример ошибки здесь:

# 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

Ошибка возникает в методе "merge.data.frame", в этой строке:

x <- rbind(x, ya)

Проблема в том, что "x" и "ya" не имеют одинаковые имена столбцов. Эта проблема возникает в этой строке, всего за две строки до предыдущей:

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

"nm.x" - это набор имен c ("v2.x", "v2.y", "v2.x"). и x - это data.frame с двумя столбцами с именем 'v2.x'. Интересно, что когда вы выбираете столбцы из этого 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

У меня опубликовано сообщение об ошибке .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...