我的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}}列除以x
列area
data.frame
中的值。每个area
匹配的种类列
我一直在尝试使用data.frame
函数:
ddply
但我无法找出density = ddply(x, "species", mutate, density = x$count/area[,2]
调用的正确索引语法,只选择与area[]
中找到的值匹配的行。但是,我是x$species
包(以及整个plyr
函数)的新手,所以这可能是完全错误的方法
我希望返回以下格式的apply*
:
data.frame
答案 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
行;此外,当Y
是data.table
时,X
和Y
中的所有对象都可以在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)