我将总结如何获得与之合作的数据帧:
name abundance
1 joe 1
2 tim 1
3 bob 1
4 joe 1
5 bob 1
首先,我通过聚合列创建了一个新的数据框,并计算了相对频率的含义:
name abundance relative_ab
1 joe 2 0.4
2 tim 1 0.2
3 bob 2 0.4
但我想在第一个数据框中添加一个列,以便有一个像relative_ab这样的冗余条目(实际的数据集中包含其他信息,我会通过聚合来丢失信息)。
name abundance relative_ab
1 joe 1 0.4
2 tim 1 0.2
3 bob 1 0.4
4 joe 1 0.4
5 bob 1 0.4
我想我可以蛮力这个,但我对R来说相对较新,并想知道你们会想出什么光滑的方式。
谢谢!
答案 0 :(得分:2)
如果您可以使用dplyr
:
library(dplyr)
df %>%
mutate(s=sum(abundance)) %>%
group_by(name) %>%
mutate(relative_ab=sum(abundance)/s, s=NULL)
name abundance relative_ab
<fctr> <int> <dbl>
1 joe 1 0.4
2 tim 1 0.2
3 bob 1 0.4
4 joe 1 0.4
5 bob 1 0.4
答案 1 :(得分:0)
您可以使用match
执行此操作。假设您的第一个data.frame是df1而第二个是df2,您可以使用:
df1$relative_ab = df2$relative_ab[match(df1$name, df2$name)]
df1
name abundance relative_ab
1 joe 1 0.4
2 tim 1 0.2
3 bob 1 0.4
4 joe 1 0.4
5 bob 1 0.4
match
使用名称来选择要使用的行。
match(df1$name, df2$name)
[1] 1 2 3 1 3
答案 2 :(得分:0)
我们可以使用基于ave
的基础R name
分组,并将小组abundance
sum
除以完整的abundance
。
df$relative_ab <- with(df,ave(abundance, name, FUN = function(x)
sum(x)/sum(abundance)))
df
# name abundance relative_ab
#1 joe 1 0.4
#2 tim 1 0.2
#3 bob 1 0.4
#4 joe 1 0.4
#5 bob 1 0.4
答案 3 :(得分:0)
我们可以使用data.table
library(data.table)
setDT(df)[, relative_ab := sum(abundance)/sum(df$abundance) , name]
df
# name abundance relative_ab
#1: joe 1 0.4
#2: tim 1 0.2
#3: bob 1 0.4
#4: joe 1 0.4
#5: bob 1 0.4