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

时间:2015-09-22 19:31:37

标签: r plyr

我的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 area,格式如下:

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

我希望将count data.frame的{​​{1}}列除以xarea data.frame中的值。每个area匹配的种类列

我一直在尝试使用data.frame函数:

ddply

但我无法找出density = ddply(x, "species", mutate, density = x$count/area[,2] 调用的正确索引语法,只选择与area[]中找到的值匹配的行。但是,我是x$species包(以及整个plyr函数)的新手,所以这可能是完全错误的方法

我希望返回以下格式的apply*

data.frame

2 个答案:

答案 0 :(得分:6)

使用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添加一个名为data.table的列,并为其指定值y

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

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

答案 1 :(得分:5)

我使用合并(left_join),然后使用mutate添加新列:

library(dplyr)

x %>% left_join(area, by="species") %>%
      mutate(density = count/area)