当行值匹配时,将数据帧的列中的值除以来自不同数据帧的值

我有一个data.frame x,格式如下:

     species      site  count
1:         A       1.1     25
2:         A       1.2   1152
3:         A       2.1     26
4:         A       3.5      1
5:         A       3.7     98
---                         
101:       B       1.2      6
102:       B       1.3     10
103:       B       2.1      8
104:       B       2.2      8
105:       B       2.3      5

我还有另一个data.frame区域,格式如下:

      species    area
1:          A    59.7
2:          B    34.4
3:          C    37.7
4:          D    22.8

当每个data.frame的species列中的值匹配时,我想将data.frame x的count列除以区域列data.frame区域中的值

我一直在尝试使用ddply函数:

density = ddply(x, "species", mutate, density = x$count/area[,2]

但我无法弄清楚area []调用的正确索引语法,只选择与x $species中找到的值匹配的行.但是,我是plyr包的新手(并且整体上应用*函数),所以这可能是完全错误的方法

我希望返回以下格式的data.frame:

     species      site  count   density
1:         A       1.1     25     0.419
2:         A       1.2    152     2.546
3:         A       2.1     26     0.436
4:         A       3.5      1     0.017
5:         A       3.7     98     1.641
---                         
101:       B       1.2      6     0.174
102:       B       1.3     10     0.291
103:       B       2.1      8     0.233
104:       B       2.2      8     0.233
105:       B       2.3      5     0.145
最佳答案
data.table很容易:

library(data.table)
#converting your data to the native type for the package (by reference)
setDT(x); setDT(area) 
x[area, density:=count/i.area, on="species"]

:=是在data.table中添加列的自然方式(通过引用,请参阅this插图和特别是b点)以获取更多有关此内容以及为什么重要的内容,因此x:= y会在数据中添加名为x的列.table并为其赋值y.

当以X [Y,]的形式合并时,我们可以将Y视为选择要操作的X行;此外,当Y是data.table时,X和Y中的所有对象都可以用j表示(即逗号后面的内容),所以我们可以说密度:= count / area;当我们想要确定我们指的是Y的列之一时,我们将其名称添加到i之前.所以我们知道我们指的是i中的一个列,即逗号之前的列.合并forthcoming应该有一个小插图.

通常,只要您认为“匹配不同的数据集”,您的直觉应该是合并.有关data.table的更多信息,请参阅here.

转载注明原文:当行值匹配时,将数据帧的列中的值除以来自不同数据帧的值 - 代码日志