我有一个非常大的数据集
mdf <- data.frame (sn = 1:40, var = rep(1:10, 4), block = rep(1:4, each = 10),
yld = c(1:40))
我的数据集很小
blockdf <- data.frame(block = 1:4, yld = c(10, 20, 30, 40)) # block means
除yld之外的两个数据集中的所有变量都是因子。
我想从每个mdf $ yld数据集中减去块均值(blockdf $ yld),这样块效应应对应于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
请注意,我可能在代表中有一些不平衡的var数量。所以我想用它可以处理不平衡情况的方式来编写它
答案 0 :(得分:4)
这应该有效
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
...........................
答案 1 :(得分:4)
这应该可以解决问题
block_match <- match(mdf$block, blockdf$block)
transform(mdf, yld = yld - blockdf[block_match, 'yld'])