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

C. *_*ney 4 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
Run Code Online (Sandbox Code Playgroud)

我还有另一种data.frame area格式如下:

      species    area
1:          A    59.7
2:          B    34.4
3:          C    37.7
4:          D    22.8
Run Code Online (Sandbox Code Playgroud)

我想分裂count的列data.frame x由值的areadata.frame area时,在每个品种列中的值data.frame匹配

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

density = ddply(x, "species", mutate, density = x$count/area[,2]
Run Code Online (Sandbox Code Playgroud)

但我无法弄清楚area[]调用的正确索引语法,只选择与找到的值匹配的行x$species.但是,我对plyr包(并且apply*作为一个整体的功能)是超级新手,所以这可能是完全错误的方法

我希望返回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
Run Code Online (Sandbox Code Playgroud)

Mic*_*ico 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"]
Run Code Online (Sandbox Code Playgroud)

:=是添加列的自然方式data.table(通过引用,请参阅插图并特别指出b)以了解更多关于此的内容以及为什么它更重要),因此x:=y添加一个命名x为您的列data.table并为其赋值y.

在表单中合并时X[Y,],我们可以将其Y视为选择X要操作的行; 此外,当Ydata.table,在双方的所有对象X,并Y在缴费j(即逗号后会发生什么),所以我们可以说density:=count/area,当我们想要确定我们引用其中一个Y列时,我们将其名称前置,i.以便我们知道我们指的是其中一个列i,即逗号之前的列.即将合并的应该有一个小插图.

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


jer*_*ycg 5

我使用merge(left_join)然后使用mutate以下命令添加新列:

library(dplyr)

x %>% left_join(area, by="species") %>%
      mutate(density = count/area)
Run Code Online (Sandbox Code Playgroud)