2011-11-10 3 views
2

J'ai un très grand ensemble de donnéesSoustraire petit data.frame de grande data.frame par groupées une variable

mdf <- data.frame (sn = 1:40, var = rep(1:10, 4), block = rep(1:4, each = 10), 
yld = c(1:40)) 

J'ai de petites ensemble de données

blockdf <- data.frame(block = 1:4, yld = c(10, 20, 30, 40)) # block means 

Toutes les variables dans les deux ensemble de données, sauf yld sont des facteurs. Je souhaite soustraire les moyennes de blocs (blockdf $ yld) de chaque jeu de données mdf $ yld, de sorte que les effets de bloc correspondent au bloc dans la structure de données mdf.

for example: value 10 will be substracted from all var within 
    first block yld in mdf 
        20 - second block yld in mdf 

and so on 

Veuillez noter que je pourrais avoir un certain nombre de déséquilibre de var dans les représentants. Donc, je veux écrire de telle façon qu'il puisse gérer la situation de déséquilibre

Répondre

4

Cela devrait faire l'affaire

block_match <- match(mdf$block, blockdf$block) 
transform(mdf, yld = yld - blockdf[block_match, 'yld']) 
4

Cela devrait fonctionner

newdf <- merge(x=mdf, y=blockdf, by="block", suffixes = c("",".blockmean")) 
newdf$newvr <- newdf$yld-newdf$yld.blockmean 
print(newdf, row.names=FALSE) 
    block sn var yld yld.blockmean newvr 
1 1 1 1   10 -9 
1 2 2 2   10 -8 
1 3 3 3   10 -7 
1 4 4 4   10 -6 
1 5 5 5   10 -5 
1 6 6 6   10 -4 
1 7 7 7   10 -3 
1 8 8 8   10 -2 
1 9 9 9   10 -1 
1 10 10 10   10  0 
2 11 1 11   20 -9 
2 12 2 12   20 -8 
...........................