-1

同じ列と異なる数の行を持つ 2 つのデータセットがあります。

> dput(smalldf)
structure(list(X = structure(1:5, .Label = c("A", "B", "C", "F", 
"G"), class = "factor"), Y = c(1L, 2L, 3L, 6L, 7L), Z = c(10L, 
20L, 30L, 60L, 70L)), .Names = c("X", "Y", "Z"), class = "data.frame", row.names = c(NA, 
-5L))


> dput(bigdf)
structure(list(X = structure(1:7, .Label = c("A", "B", "C", "D", 
"E", "F", "G"), class = "factor"), Y = c(10L, 20L, 30L, 40L, 
50L, 60L, 70L), Z = c(100L, 200L, 300L, 400L, 500L, 600L, 700L
)), .Names = c("X", "Y", "Z"), class = "data.frame", row.names = c(NA, 
-7L))

同様の行を一致させて、Y 列を減算したいと思います。これは非常に簡単な作業であることはわかっていますが、私にはできませんでした。私は使用する必要がありmatch()ますか?またはここに何らかのapply()機能がありますか?

4

1 に答える 1

2

これはよくある問題です。baseRでそれを行う1つの方法はmatch、あなたが提案するように、このようapplyに見えないように使用することです....

#  rows of bigdf that appear in smalldf, in order that they appear in smalldf 
idx <- match( rownames(smalldf) , rownames(bigdf) ) 

#  subtract rows of smalldf from bigdf for rows that appear in smalldf and rbind them with original rows from bigdf that do not appear in samlldf
result <- rbind( ( bigdf[ idx , ] - smalldf ) , bigdf[ -idx , ] )

#  Order the results
result <- result[ order( rownames(result) ) , ]
   X  Y  Z
A  3  2  5
B 10  3  7
C  0  0  6
D  5  3  4
E  9 -2 20
于 2013-08-06T10:30:14.740 に答える