14

次の例では

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()に列を並べ替えることです。これを防ぎ、x の同じ列順序を使用して、新しい変数 (isFruit) を 3 番目の列 (つまり、「food, code, isFruit」ではなく「code, food, isFruit」) として挿入するにはどうすればよいですか?bymerge(x, y)

私はこれを試しましたが、役に立ちませんでした:

merge(x, y, sort = F)

私の回避策は、後でこれを行うことです

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

4 に答える 4

31

基本的な回避策の一般的なバージョンは次のとおりです。

merge(x, y)[, union(names(x), names(y))]
于 2013-07-10T19:16:49.407 に答える
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

EDIT @Eddi のアイデアを使用して、ord のデフォルト値を設定します。

于 2013-07-10T18:17:14.647 に答える
1

1 つの列だけを取り込み、それを最後に追加したい場合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

(あなたが要求したことを行うためにマージ関数を投入するスイッチはありません。)

于 2013-07-10T20:10:38.260 に答える