Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过分组变量从大data.frame中减去小data.frame_R_Dataframe_Operation - Fatal编程技术网

通过分组变量从大data.frame中减去小data.frame

通过分组变量从大data.frame中减去小data.frame,r,dataframe,operation,R,Dataframe,Operation,我有一个非常大的数据集 mdf <- data.frame (sn = 1:40, var = rep(1:10, 4), block = rep(1:4, each = 10), yld = c(1:40)) 请注意,我可能在销售代表中有时出现var数量不平衡的情况。所以我想用这样的方式来写它,它可以处理不平衡的情况 newdf <- merge(x=mdf, y=blockdf, by="block", suffixes = c("",".blockmean")) new

我有一个非常大的数据集

  mdf <- data.frame (sn = 1:40, var = rep(1:10, 4), block = rep(1:4, each = 10), 
yld = c(1:40))
请注意,我可能在销售代表中有时出现var数量不平衡的情况。所以我想用这样的方式来写它,它可以处理不平衡的情况

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
...........................

newdf这应该可以做到

block_match <- match(mdf$block, blockdf$block)
transform(mdf, yld = yld - blockdf[block_match, 'yld'])
块匹配
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
...........................
block_match <- match(mdf$block, blockdf$block)
transform(mdf, yld = yld - blockdf[block_match, 'yld'])