2016-11-26 5 views
0
ためrownamesを使用して、2 data.framesを追加

だから私は、行が同一row.namesのために追加された2つのデータフレームを、追加する方法:インデックス

x = data.frame(x = 1:10, y = 10:1); y = x 
rownames(y) = as.numeric(rownames(x)) + 5 

x + y #WRONG, rows should be offset by '5', producing a data.frame that has 15 rows. 

でき、おそらくそれは追加することによって、ddply使用して行います

x$id = as.numeric(rownames(x)) 
y$id = as.numeric(rownames(y)) 
plyr::ddply(rbind(x,y),'id',function(x){ 
    colSums(x[,c('x','y')]) 
})[,-1] 

ターゲット結果:上記で

x y 
1 1 10 
2 2 9 
3 3 8 
4 4 7 
5 5 6 
6 7 15 
7 9 13 
8 11 11 
9 13 9 
10 15 7 
11 6 5 
12 7 4 
13 8 3 
14 9 2 
15 10 1 

、行6(また、私が望む結果を示している)、このようなインデックス列、 :10は、インデックス列と交差する2つのデータフレームの交点の合計です。

+1

これは 'add'よりも' join'のようです。多くの計算を行うために行名に頼らないことを強くお勧めします。いくつかのパッケージ(例えば、 'dplyr')は、それを無視する/削除します。あなたはインデックスとして行の名前を使用しているようですので、明示的に '$ id'のような列を追加しないでください。その場合、 'x $ id < - 1:10;などのような多くの結合技術の1つを使うことができます。 y $ id < - 6:15; dplyr :: bind_rows(x、dplyr :: anti_join(y、x、by = "id")) '。 – r2evans

+1

これは、 'merge(x、y、by = 0、all = TRUE)'のようなmergeを使って扱いやすくなります。 –

+0

人々はあなたが望むものを推測しましたが、間違いなく追加しています。質問をより明確にすることを検討してください。そのまま閉じるように投票する。 – marbel

答えて

2
# I would use aggregate 
d <- aggregate(rbind.data.frame(x, y), 
       list(rowname = c(rownames(x), rownames(y))), 
       sum) 
# if you want the rows ordered as before 
d <- d[order(as.numeric(d$rowname)), ] 

# rowname x y 
# 1  1 1 10 
# 8  2 2 9 
# 9  3 3 8 
# 10  4 4 7 
# 11  5 5 6 
# 12  6 7 15 
# 13  7 9 13 
# 14  8 11 11 
# 15  9 13 9 
# 2  10 15 7 
# 3  11 6 5 
# 4  12 7 4 
# 5  13 8 3 
# 6  14 9 2 
# 7  15 10 1 
4

あなたは、一般的にはお勧めできません行名でマージすることができthis-

a <- rownames(x) 
b <- rownames(y) 
rbind(x[!(a %in% b),], x[intersect(a, b),] + 
     y[intersect(a, b),], y[!(b %in% a),]) 
+0

これはいいです... –

1

を試してみてください。次に、同じxとyのインデックスを取得し、行の合計を取る。

xx=merge(x, y, by=0, all=TRUE) 
l=lapply(names(x), function(yy) grep(paste('^',yy,'.*', sep = ''), names(xx))) 
df=as.data.frame(sapply(l, function(yy) rowSums(xx[,yy], na.rm = T))) 
names(df)=names(x) 
df[order(as.numeric(xx$Row.names)),] 

    x y 
1 1 10 
8 2 9 
9 3 8 
10 4 7 
11 5 6 
12 7 15 
13 9 13 
14 11 11 
15 13 9 
2 15 7 
3 6 5 
4 7 4 
5 8 3 
6 9 2 
7 10 1 
関連する問題