Как предотвратить слияние от переупорядочивания столбцов
в следующем примере
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 ответов
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
(нет никаких переключателей, чтобы бросить функцию слияния, чтобы сделать то, что вы просите.)