2016-07-19 7 views
4

ここでは私の問題です:どのようにマージすると、合計2つのデータフレーム

私が望んで
df1 <- data.frame(x = 1:5, y = 2:6, z = 3:7) 
rownames(df1) <- LETTERS[1:5] 
df1 
    x y z 
A 1 2 3 
B 2 3 4 
C 3 4 5 
D 4 5 6 
E 5 6 7 

df2 <- data.frame(x = 1:5, y = 2:6, z = 3:7) 
rownames(df2) <- LETTERS[3:7] 
df2 
    x y z 
C 1 2 3 
D 2 3 4 
E 3 4 5 
F 4 5 6 
G 5 6 7 

は次のとおりです。重複行が同じ変数により加算された

x y z 
A 1 2 3 
B 2 3 4 
C 4 6 8 
D 6 8 10 
E 8 10 12 
F 4 5 6 
G 5 6 7 

。でdplyrで

+0

行の名前がデータセット内の別の属性として表された場合、それは機能しますか? – Sevyns

+0

なぜこの質問が@akrunによって重複しているとマークされているのか分かりません。彼らはまったく別の問題です! –

+0

さて、それを開いた。 – akrun

答えて

4

library(dplyr) 

# add rownames as a column in each data.frame and bind rows 
bind_rows(df1 %>% add_rownames(), 
      df2 %>% add_rownames()) %>% 
    # evaluate following calls for each value in the rowname column 
    group_by(rowname) %>% 
    # add all non-grouping variables 
    summarise_all(sum) 

## # A tibble: 7 x 4 
## rowname  x  y  z 
##  <chr> <int> <int> <int> 
## 1  A  1  2  3 
## 2  B  2  3  4 
## 3  C  4  6  8 
## 4  D  6  8 10 
## 5  E  8 10 12 
## 6  F  4  5  6 
## 7  G  5  6  7 
7

# create a new variable from the rownames 
df1$rn <- rownames(df1) 
df2$rn <- rownames(df2) 

# bind the two dataframes together by row and aggregate 
res <- aggregate(cbind(x,y,z) ~ rn, rbind(df1,df2), sum) 
# or (thx to @alistaire for reminding me): 
res <- aggregate(. ~ rn, rbind(df1,df2), sum) 

# assign the rownames again 
rownames(res) <- res$rn 

# get rid of the 'rn' column 
res <- res[, -1] 

あなたが得る:

> res 
    x y z 
A 1 2 3 
B 2 3 4 
C 4 6 8 
D 6 8 10 
E 8 10 12 
F 4 5 6 
G 5 6 7 
+0

奇妙なことに、私は決して式コンテキストで 'cbind'を使ったことはありません。 '.'は' cbind(x、y、z) 'よりも私には意味がありますが(私はそれが' + 'であると考えています)、後者は実際にはかなり役に立ちます... – alistaire

+1

@alistaire' cbind' isグループ化されていないすべてのカラムに集約関数を適用したくない場合に便利です(ただし、 '.'オプションについては忘れてしまったことを認めなければなりません;-)) – Jaap

2

これは長い例に取り組んでrownamesロジックを取得するには、いくつかのteakingが必要になる場合があります。

dfr <-rbind(df1,df2) 
do.call(rbind, lapply(split(dfr, sapply(rownames(dfr),substr,1,1)), colSums)) 
    x y z 
A 1 2 3 
B 2 3 4 
C 4 6 8 
D 6 8 10 
E 8 10 12 
F 4 5 6 
G 5 6 7 

rownamesをすべてアルファベット文字と見なすことができる場合は、gsub解決策は簡単です。

2

データを溶かしてキャストする方法もあります。まずは@Procrastinatusマクシムスのおかげ

df1$rn <- rownames(df1) 
df2$rn <- rownames(df2) 

はその後、我々は名前

melt(list(df1, df2), id.vars = "rn") 

に基づいたデータは、その後、我々は、mgetは機能してdcast使用溶融両方のデータフレームの最後の列に行名を設定します複数の変数を一度に取得するために使用されます。

mydf<- dcast(melt(mget(ls(pattern = "df\\d+")), id.vars = "rn"), 
     rn ~ variable, value.var = "value", fun.aggregate = sum) 

rownames(mydf) <- mydf$rn 

# get rid of the 'rn' column 
mydf <- mydf[, -1] 

> mydf 
# x y z 
#A 1 2 3 
#B 2 3 4 
#C 4 6 8 
#D 6 8 10 
#E 8 10 12 
#F 4 5 6 
#G 5 6 7 
関連する問題