Как предотвратить слияние от переупорядочивания столбцов

в следующем примере

x <- data.frame(code = 7:9, food = c('banana', 'apple', 'popcorn'))
y <- data.frame(food = c('banana', 'apple', 'popcorn'),
                isfruit = c('fruit', 'fruit', 'not fruit'))

Я хотел бы сделать x <- merge(x, y), но проблема в том, что merge() переупорядочивает столбцы так, чтобы by колонка (питание) идет первым. как я могу предотвратить это и есть merge(x, y) используйте тот же порядок столбцов x и просто вставьте новую переменную (isFruit) в качестве третьего столбца (т. е. "код, еда, isFruit" вместо "еда, код, isFruit")?

Я пробовал это, но безрезультатно:

merge(x, y, sort = F)

мой обходной путь-сделать это позже

x <- x[c(2, 1, 3)]

4 ответов


вот общая версия вашего базового обходного пути:

merge(x, y)[, union(names(x), names(y))]

plyr делает это легко:

 x <- data.frame(code = 7:9, food = c('banana', 'apple', 'popcorn'))
 y <- data.frame(food = c('banana', 'apple', 'popcorn'),
                isfruit = c('fruit', 'fruit', 'not fruit'))

library(plyr)
join(x,y)

        #GOOD 
#Joining by: food
#  code    food   isfruit
#1    7  banana     fruit
#2    8   apple     fruit
#3    9 popcorn not fruit

    #BAD  
# merge(x,y)
#     food code   isfruit
#1   apple    8     fruit
#2  banana    7     fruit
#3 popcorn    9 not fruit

вы можете обернуть его в свою пользовательскую функцию. Например :

merge.keep <- function(...,ord=union(names(x), names(y)))merge(...)[ord]

потом например:

merge.keep(x,y)
  code    food   isfruit
1    8   apple     fruit
2    7  banana     fruit
3    9 popcorn not fruit

редактировать я использую @ Eddi idea для установки значений по умолчанию ord.


если вы приносите только один столбец и хотите добавить его последним, возможно,merge является излишним, и вы можете просто сделать assingment с match -[индексирование подход:

> x$isfruit <- y$isfruit[match(y$food, x$food)]
> x
  code    food   isfruit
1    7  banana     fruit
2    8   apple     fruit
3    9 popcorn not fruit

(нет никаких переключателей, чтобы бросить функцию слияния, чтобы сделать то, что вы просите.)