在以下示例中
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)作为第三列(即“code,food,isFruit”而不是“food,代码,isFruit“)?
我试过这个,但无济于事:
merge(x, y, sort = F)
我的解决方法是在之后执行此操作
x <- x[c(2, 1, 3)]
答案 0 :(得分:23)
以下是基础解决方法的通用版本:
merge(x, y)[, union(names(x), names(y))]
答案 1 :(得分:11)
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
答案 2 :(得分:6)
您可以将其包装在自定义功能中。例如:
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的想法来设置ord的默认值。
答案 3 :(得分:0)
如果您只引入一列并希望最后添加,那么merge
可能过度,您可以使用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
(没有用于引入合并功能的开关来执行您的要求。)